From a5e9ff6ab9b9031c567d372b2d4dbf01d2a085f3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 04:49:10 -0700 Subject: [PATCH 01/31] Fix #703 (crashes when pressing configure or config buttons on windows) --- src/calibre/gui2/make.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/make.py b/src/calibre/gui2/make.py index 74ecafa10a..c32136f129 100644 --- a/src/calibre/gui2/make.py +++ b/src/calibre/gui2/make.py @@ -39,9 +39,12 @@ def build_forms(forms): dat = dat.replace('import images_rc', 'from calibre.gui2 import images_rc') dat = dat.replace('from library import', 'from calibre.gui2.library import') dat = dat.replace('from widgets import', 'from calibre.gui2.widgets import') - #dat += '\nfrom calibre.gui2 import TranslatedDialogButtonBox' dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(? Date: Mon, 4 Aug 2008 10:05:02 -0700 Subject: [PATCH 02/31] version 0.4.81 --- installer/linux/freeze.py | 5 +- src/calibre/__init__.py | 11 +- src/calibre/debug.py | 2 +- src/calibre/devices/prs505/driver.py | 2 +- src/calibre/ebooks/epub/__init__.py | 8 + src/calibre/ebooks/epub/traverse.py | 184 ++++++ src/calibre/gui2/dialogs/comicconf.py | 8 +- src/calibre/gui2/dialogs/comicconf.ui | 2 +- src/calibre/translations/bg.po | 721 +++++++++++++-------- src/calibre/translations/ca.po | 715 +++++++++++++-------- src/calibre/translations/de.po | 772 ++++++++++++++-------- src/calibre/translations/el.po | 721 +++++++++++++-------- src/calibre/translations/es.po | 743 +++++++++++++-------- src/calibre/translations/fr.po | 886 +++++++++++++++++--------- src/calibre/translations/it.po | 754 ++++++++++++++-------- src/calibre/translations/nds.po | 772 ++++++++++++++-------- src/calibre/translations/nl.po | 744 +++++++++++++-------- src/calibre/translations/pt.po | 721 +++++++++++++-------- src/calibre/translations/ru.po | 488 +++++++++----- src/calibre/translations/sl.po | 721 +++++++++++++-------- src/calibre/translations/te.po | 721 +++++++++++++-------- src/calibre/utils/config.py | 9 + 22 files changed, 6275 insertions(+), 3435 deletions(-) create mode 100644 src/calibre/ebooks/epub/__init__.py create mode 100644 src/calibre/ebooks/epub/traverse.py diff --git a/installer/linux/freeze.py b/installer/linux/freeze.py index 34c2b0d10d..0203e7d0ae 100644 --- a/installer/linux/freeze.py +++ b/installer/linux/freeze.py @@ -20,7 +20,9 @@ SQLITE = '/usr/lib/libsqlite3.so.0' DBUS = '/usr/lib/libdbus-1.so.3' LIBMNG = '/usr/lib/libmng.so.1' LIBZ = '/lib/libz.so.1' +LIBBZ2 = '/lib/libbz2.so.1' LIBUSB = '/lib/libusb.so' +LIBPOPPLER = '/usr/lib/libpoppler.so.3' CALIBRESRC = os.path.join(CALIBREPREFIX, 'src') @@ -119,7 +121,8 @@ binaries += [('clit', CLIT, 'BINARY'), ('pdftohtml', PDFTOHTML, 'BINARY'), ('libunrar.so', LIBUNRAR, 'BINARY')] print 'Adding external libraries...' -binaries += [ (os.path.basename(x), x, 'BINARY') for x in (SQLITE, DBUS, LIBMNG, LIBZ, LIBUSB)] +binaries += [ (os.path.basename(x), x, 'BINARY') for x in (SQLITE, DBUS, + LIBMNG, LIBZ, LIBBZ2, LIBUSB, LIBPOPPLER)] qt = [] diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index ff03260f2b..2d2e8739ae 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.80' +__version__ = '0.4.81' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' @@ -116,7 +116,14 @@ def my_join(a, *p): res = res.decode(encoding) return res -os.path.join = my_join +os.path.join = my_join + +def unicode_path(path, abs=False): + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) + if abs: + path = os.path.abspath(path) + return path def osx_version(): if isosx: diff --git a/src/calibre/debug.py b/src/calibre/debug.py index e25fd77c97..7a12ee62b5 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -25,7 +25,7 @@ Run an embedded python interpreter. def update_zipfile(zipfile, mod, path): if 'win32' in sys.platform: print 'WARNING: On Windows Vista you must run this from a console that has been started in Administrator mode.' - print 'Press Enter to continue or Ctrl-C to Cancel' + print 'Press Enter to continue if this is an Administrator console or Ctrl-C to Cancel' raw_input() pat = re.compile(mod.replace('.', '/')+r'\.py[co]*') name = mod.replace('.', '/') + os.path.splitext(path)[-1] diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 45c76d7089..5fc2b0c1cd 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -135,7 +135,7 @@ class PRS505(Device): if 'PRS-505/UC&' in device_id: main = volumes[device_id]+':\\' if not main: - DeviceError(_('Unable to detect the %s disk drive. Try rebooting.')%self.__class__.__name__) + raise DeviceError(_('Unable to detect the %s disk drive. Try rebooting.')%self.__class__.__name__) self._main_prefix = main card = self._card_prefix = None win32api = __import__('win32api') diff --git a/src/calibre/ebooks/epub/__init__.py b/src/calibre/ebooks/epub/__init__.py new file mode 100644 index 0000000000..75527d6323 --- /dev/null +++ b/src/calibre/ebooks/epub/__init__.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Conversion to EPUB. +''' diff --git a/src/calibre/ebooks/epub/traverse.py b/src/calibre/ebooks/epub/traverse.py new file mode 100644 index 0000000000..670e056028 --- /dev/null +++ b/src/calibre/ebooks/epub/traverse.py @@ -0,0 +1,184 @@ +from __future__ import with_statement +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Recursively parse HTML files to find all linked files. +''' + +import sys, os, re +from urlparse import urlparse +from urllib import unquote +from calibre import unicode_path +from calibre.ebooks.chardet import xml_to_unicode + +class Link(object): + ''' + Represents a link in a HTML file. + ''' + + @classmethod + def url_to_local_path(cls, url, base): + path = url.path + if os.path.isabs(path): + return path + return os.path.abspath(os.path.join(base, url)) + + def __init__(self, url, base): + ''' + :param url: The url this link points to. Must be an unquoted unicode string. + :param base: The base directory that relative URLs are with respect to. + Must be a unicode string. + ''' + assert isinstance(url, unicode) and isinstance(base, unicode) + self.url = url + self.parsed_url = urlparse(unquote(self.url)) + self.is_local = self.parsed_url.scheme in ('', 'file') + self.path = None + self.fragment = self.parsed_url.fragment + if self.is_local: + self.path = self.url_to_local_path(self.parsed_url, base) + + def __hash__(self): + if self.path is None: + return hash(self.url) + return hash(self.path) + + def __eq__(self, other): + if not (hasattr(other, 'url') and hasattr(other, 'path')): + return False + if self.path is None: + return self.url == other.url + return self.path == other.path + + +class IgnoreFile(Exception): + pass + +class HTMLFile(object): + ''' + Contains basic traversal information about an HTML file. This + includes a recursive list of links to other files as well as + the encoding of each file. + + You can iterate over the tree of files rooted at this file + by calling either :method:`breadth_first` or :method:`depth_first`. + + The encoding of the file is available as :member:`encoding`. + + If the file is a binary file (i.e. if conversion to unicode fails) + :member:`is_binary` is set to `True`. + ''' + + LINK_PAT = re.compile( + r'<\s*a\s+.*?href\s*=\s*(?:(?:"(?P[^"]+)")|(?:\'(?P[^\']+)\')|(?P[^\s]+))', + re.DOTALL|re.IGNORECASE) + + def __init__(self, path_to_html_file, level, max_levels=sys.maxint, + encoding=None, verbose=0): + ''' + :param level: The level of this file. Should be 0 for the root file. + :param max_levels: `level >= max_levels` the links in this file + will not be followed. + :param encoding: Use `encoding` to decode HTML. + ''' + self.path = unicode_path(path_to_html_file, abs=True) + self.base = os.path.dirname(self.path) + self.level = level + self.links = [] + self.map = {} + self.is_binary = False + try: + with open(self.path, 'rb') as f: + src = f.read() + except IOError, err: + msg = 'Could not read from file: %s with error: %s'% + (self.path, unicode(err)) + if level == 0: + raise IOError(msg) + if verbose: + print msg + raise IgnoreFile + if encoding is None: + encoding = xml_to_unicode(src[:4096], verbose=verbose)[-1] + self.encoding = encoding + + + try: + src = src.decode(encoding, 'replace') + except UnicodeDecodeError: + self.is_binary = True + if verbose > 1: + print self.path, 'is a binary file.' + else: + self.find_links(src) + + if self.level < max_levels: + rejects = [] + for link in self.links: + if link.path is not None: + try: + self.map[link.url] = HTMLFile(link.path, level+1, + max_levels, encoding=encoding, verbose=verbose) + except IgnoreFile: + rejects.append(link) + for link in rejects: + self.links.remove(link) + + + def find_links(self, src): + for match in self.LINK_PAT.finditer(): + url = None + for i in ('url1', 'url2', 'url3'): + url = match.group(i) + if url: + break + link = Link(url, self.base) + if link not in self.links: + self.links.append(link) + + def breadth_first(self, root=True): + ''' + Walk over the tree of linked files (by `` links) breadth + first. + + :param root: If `True` return `self` as the first file. + :return: A breadth-first iterator. + ''' + if root: + yield self + for link in self.links: + if link.path is not None: + yield self.map[link.url] + + for link in self.links: + if link.path is not None: + for hf in self.map[link.url].breadth_first(root=False): + yield hf + + def depth_first(self, root=True): + ''' + Walk over the tree of linked files (by `` links) depth + first. + + :param root: If `True` return `self` as the first file. + :return: A depth-first iterator. + ''' + if root: + yield self + for link in self.links: + if link.path is not None: + yield self.map[link.url] + for hf in self.map[link.url].depth_first(root=False): + yield hf + +if __name__ == '__main__': + root = HTMLFile(sys.argv[1], 0, verbose=2) + print 'Depth first...' + for f in root.depth_first(): + print f.path + print '\n\nBreadth first...' + for f in root.breadth_first(): + print f.path + diff --git a/src/calibre/gui2/dialogs/comicconf.py b/src/calibre/gui2/dialogs/comicconf.py index 7f42750fdd..36043b5224 100644 --- a/src/calibre/gui2/dialogs/comicconf.py +++ b/src/calibre/gui2/dialogs/comicconf.py @@ -14,17 +14,13 @@ def set_conversion_defaults(window): d.exec_() def get_bulk_conversion_options(window): - c = config(None) - with open(c.config_file_path, 'rb') as f: - d = ComicConf(window, config_defaults=f.read()) + d = ComicConf(window, config_defaults=config(None).as_string()) if d.exec_() == QDialog.Accepted: return d.config.parse() def get_conversion_options(window, defaults, title, author): if defaults is None: - c = config(None) - with open(c.config_file_path, 'rb') as f: - defaults = f.read() + defaults = config(None).as_string() defaults += '\ntitle=%s\nauthor=%s'%(repr(title), repr(author)) d = ComicConf(window, config_defaults=defaults, generic=False) if d.exec_() == QDialog.Accepted: diff --git a/src/calibre/gui2/dialogs/comicconf.ui b/src/calibre/gui2/dialogs/comicconf.ui index 9e6198eaf7..56d939f787 100644 --- a/src/calibre/gui2/dialogs/comicconf.ui +++ b/src/calibre/gui2/dialogs/comicconf.ui @@ -110,7 +110,7 @@ - Dont so&rt + Don't so&rt diff --git a/src/calibre/translations/bg.po b/src/calibre/translations/bg.po index 14a309fd3e..ec2174f599 100644 --- a/src/calibre/translations/bg.po +++ b/src/calibre/translations/bg.po @@ -6,35 +6,53 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.51\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-05-24 06:23+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "" @@ -46,14 +64,17 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "" @@ -315,7 +336,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -326,10 +347,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -338,7 +441,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -346,11 +449,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -363,95 +470,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -462,7 +569,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -644,12 +751,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -706,11 +812,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -722,22 +828,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -751,13 +849,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -772,6 +871,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -780,52 +924,53 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -839,85 +984,93 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1049,7 +1202,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "" @@ -1140,17 +1292,17 @@ msgid "Options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" @@ -1159,25 +1311,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1189,24 +1341,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -1214,7 +1366,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "" @@ -1222,20 +1374,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "" @@ -1313,10 +1465,6 @@ msgstr "" msgid "Override
CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -1411,36 +1559,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr "" @@ -1450,8 +1598,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1463,67 +1611,71 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

Enter your username and password for LibraryThing.com.
If you " "do not have one, you can
register " "for free!.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 -msgid "IS&BN:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "" @@ -2068,110 +2220,118 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

For help visit %s.kovidgoyal.net
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

The database of books on the reader is corrupted. Try the " @@ -2187,190 +2347,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

Books with the same title as the following already exist in the database. " "Add them anyway?

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

      %s
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

    Could not save the following books to disk, because the %s format is not " "available for them:

      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

      Could not convert %d of %d books, because no suitable source format was " +"found.

        %s
      " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

      An invalid database already exists at %s, delete it before trying to move " "the existing database.
      Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2483,23 +2675,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

      Browsing books by their covers is disabled.
      Import of pictureflow " "module failed:
      " @@ -2588,13 +2780,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2603,27 +2795,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2632,11 +2824,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2645,15 +2837,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2663,11 +2855,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2677,15 +2869,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2698,11 +2890,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2713,27 +2905,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2745,11 +2937,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2858,9 +3050,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2889,58 +3080,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 8fa4582225..b4c5ac770c 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-05-24 06:21+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -143,24 +143,42 @@ msgstr "" #~ "font-weight:600;\">calibre: %1 de Kovid Goyal %2
      %3

      " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Creat per " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Indique el títol. Per defecte: nom_del_fitxer." @@ -174,14 +192,17 @@ msgstr "" "comes. Per defecte: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Desconegut" @@ -484,7 +505,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -495,10 +516,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -507,7 +610,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -515,11 +618,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -532,95 +639,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -631,7 +738,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -813,12 +920,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -875,11 +981,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -891,22 +997,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -920,13 +1018,14 @@ msgstr "Tí­tol" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Comentaris" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -941,6 +1040,51 @@ msgstr "TextLabel" msgid "Choose Format" msgstr "Trieu format" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Perfil:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -949,52 +1093,53 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
      Must be a directory." msgstr "
      Cal que siga un directori." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Ubicació de la base de dades no vàlida " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Ubicació de la base de dades no vàlida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
      Cannot write to " msgstr "Ubicació de la base de dades no vàlida.
      No es pot escriure " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuració" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "&Ubicació de la base de dades (library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Cerca la nova ubicació de la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1008,85 +1153,93 @@ msgstr "Cerca la nova ubicació de la base de dades" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Directoris emprats amb freqüència" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "Afegir el directori al llistat de directoris freqüents" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "Elimiar el directori al llistat de directoris freqüents" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1220,7 +1373,6 @@ msgid "Convert %s to LRF" msgstr "Converteix %s a LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Fixa els valors de conversió er defecte" @@ -1320,17 +1472,17 @@ msgid "Options" msgstr "Opcions" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Coberta" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "Canvia la imatge de la &coberta:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Cerca una imatge per a utilitzar com a coberta d'aquest llibre." @@ -1339,25 +1491,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Tí­tol: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Canvia el tí­tol del llibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Autor(s): " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1370,24 +1522,24 @@ msgstr "Ord&re per autor:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Editorial: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Canvia l'editorial del llibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "Etique&tes: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

      They can be any words or phrases, separated by commas." @@ -1397,7 +1549,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Sèries:" @@ -1405,20 +1557,20 @@ msgstr "&Sèries:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Llistat de sèries conegudes. Podeu afegir-hi de noves." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Índex de sèrie." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Llibre " @@ -1496,10 +1648,6 @@ msgstr "&Format de la capçalera:" msgid "Override
      CSS" msgstr "Substitueix
      CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Perfil:" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Marge &Esquerre:" @@ -1594,17 +1742,17 @@ msgid "Edit Meta information" msgstr "Editar Meta-informació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Meta-informació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "&Ordena autors: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1613,19 +1761,19 @@ msgstr "" "exemple,ordena Vicent A. Estellés com a Estellés, Vicent A." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Valoració:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Valora aquest llibre: 0-5 estreles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " estreles" @@ -1635,8 +1783,8 @@ msgstr "Afe&geix les etiquetes: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1648,68 +1796,72 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

      Enter your username and password for LibraryThing.com.
      If you " "do not have one, you can register " "for free!.

      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
      " msgstr "No puc aconseguir la coberta.
      " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "No puc aconseguir la coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "No puc aconseguir la coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Cal especificar un ISBN correcte per al llibre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Recull metadades des del servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Afegir un nou format per a aquest llibre a la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina els formats seleccionats per a aquest llibre de la base de dades." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Recolliu la coberta des del servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "" @@ -2254,110 +2406,118 @@ msgstr "Obre l'eBook" msgid "Configure" msgstr "Configura" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Error en la comunicació amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

      For help visit %s.kovidgoyal.net
      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
      %%(device)s

      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "Envia a la memòria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "Envia a la targeta de memòria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Edita metadades individualment" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Edita metadades en massa" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Desa al disc" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Mostra" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Converteix individualment" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Converteix tots" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

      The database of books on the reader is corrupted. Try the " @@ -2373,157 +2533,189 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

      Books with the same title as the following already exist in the database. " "Add them anyway?

        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Sense espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

        Cannot upload books to device there is no more free space available " msgstr "

        No puc desar llibres al dispositiu perquè no hi ha espai restant " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "No puc editar les meta-dades" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Cap llibre seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

          %s
        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "No puc desar al disc" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

        Could not save the following books to disk, because the %s format is not " "available for them:

          " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "No puc convertir-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

          Could not convert %d of %d books, because no suitable source format was " +"found.

            %s
          " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Cap llibre seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "No puc mostrar-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "No puc configurar-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "No puc configurar-lo amb treballs processant-se" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

          An invalid database already exists at %s, delete it before trying to move " "the existing database.
          Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "No puc moure la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Error comunicant amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2531,34 +2723,34 @@ msgstr "" "Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " "connectar el dispositiu i torne a iniciar el programa" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2675,23 +2867,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Treballs:" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

          Browsing books by their covers is disabled.
          Import of pictureflow " "module failed:
          " @@ -2784,13 +2976,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2799,27 +2991,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2828,11 +3020,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2841,15 +3033,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2859,11 +3051,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2873,15 +3065,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2894,11 +3086,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2909,27 +3101,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2941,11 +3133,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -3054,9 +3246,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -3085,58 +3276,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 0cb62a9944..be9dde72ff 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-09 06:11+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-08-04 11:27+0000\n" "Last-Translator: S. Dorscht \n" "Language-Team: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -49,6 +49,9 @@ msgstr "" #~ "Beispiel: --serif-family \"%s, Times New Roman\"\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "dateiname.epub" + #~ msgid "The author whoose book to search for." #~ msgstr "Der Autor des gesuchten Buches." @@ -94,24 +97,42 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif'; font-size:9pt;\">

          " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sBenutzung%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Erstellt von " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Konnte das Laufwerk %s nicht finden. Versuchen Sie einen Neustart." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "Im Reader ist keine Speicherkarte eingesteckt." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "%prog [options] LITFILE" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Hilfreich bei der Fehlersuche." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "OEB eBook erstellt in" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Geben Sie den Titel an. Voreinstellung: Dateiname." @@ -125,14 +146,17 @@ msgstr "" "angegeben werden. Voreinstellung: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Unbekannt" @@ -444,7 +468,7 @@ msgstr "Nichtproportionale Schriftartfamilie einbetten" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:210 msgid "Be verbose while processing" -msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." +msgstr "Bei der weiteren Verarbeitung ausführlicher vorgehen" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Convert to LRS" @@ -472,7 +496,7 @@ msgstr "" "cp-1252. Eine andere gebräuchliche Alternative ist utf-8. In der " "Voreinstellung wird versucht, die Kodierung zu erraten." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -491,10 +515,116 @@ msgstr "" "ZIP Archive, indem es nach einem eBook im Archiv sucht.\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "Keine Datei zur Konvertierung angegeben." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "%s gerendert." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" +"Einstellungen zur Kontrolle der Konvertierung von Comic (CBR, CBZ) Dateien " +"zu eBooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" +"Titel für erstelltes eBook. In der Voreinstellung wird der Dateiname benutzt." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" +"Gibt den Autor in den Metadaten des erstellen eBooks an. Voreinstellung ist " +"%default." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" +"Pfad zur ausgegebenen LRF Datei. Laut Voreinstellung wird die Datei im " +"aktuellen Verzeichnis erstellt." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" +"Anzahl der Farben für die Bildkonvertierung in Graustufen. Voreinstellung: " +"%default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" +"Deaktivieren der Normalisierung (verbessert den Kontrast) des Farbbereichs " +"für Bilder. Voreinstellung: False" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" +"Seitenverhältnis des Bildes beibehalten. Voreinstellung ist " +"bildschirmfüllende Darstellung." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "Schärfen deaktivieren." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "Bilder im Querformat nicht in zwei Bilder im Hochformat aufteilen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" +"Dateien, die im Comic gefunden wurden, nicht alphabetisch nach Namen " +"sortieren, sondern die Reihenfolge verwenden, in der sie zum Comic " +"hinzugefügt wurden." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" +"Wählen Sie ein Profil für das Gerät, für das Sie diese LRF Datei erstellen. " +"Die Voreinstellung ist der SONY PRS-500 mit einer Bildschirmgröße von " +"584x754 Punkten. Wahlmöglichkeiten sind %s" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" +"Ausführlicher, hilfreich zur Fehlersuche. Kann mehrmals angegeben werden um " +"eine größere Ausführlichkeit zu erreichen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "Fortschrittsbalken nicht anzeigen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Konvertiert ein Comic einer CBZ oder CBR Datei in ein LRF eBook. \n" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "Rendere Seiten des Comics..." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "Ausgabe gespeichert unter" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -507,7 +637,7 @@ msgstr "" " \n" "%prog konvertiert dateiname.epub in dateiname.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -519,11 +649,15 @@ msgstr "" "\n" "%prog konvertiert dateiname.fb2 in dateiname.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Gebe erstellte HTML auf stdout aus und beende das Programm." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "Erstellte HTML Dateien nach vollzogener LRF Konvertierung behalten." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Einstellungen für feeds2disk" @@ -536,56 +670,56 @@ msgstr "Einstellungen für html2lrf" msgid "Fetching of recipe failed: " msgstr "Abruf des Rezepts misslungen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "\tBook Designer Datei erkannt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tAnalysiere HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen Datei erkannt. Analysiere erneut..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "Vorverarbeitetes HTML gespeichert unter " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Verarbeite %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tKonvertiere in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "Konnte Datei nicht analysieren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%s ist eine leere Datei" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "Fehlschlag bei der Analysierung von %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "Konnte Link %s nicht zu TOC hinzufügen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Konnte Bild %s nicht verarbeiten. Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "Konnte verschachteltes PNG %s nicht verarbeiten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -593,14 +727,14 @@ msgstr "" "Konnte Bild nicht verarbeiten: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ein Fehler trat während der Bearbeitung einer Tabelle auf: %s. " "Tabellenformat wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -608,11 +742,11 @@ msgstr "" "Schlechte Tabelle:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "Tabelle enthält Zelle, die zu groß ist" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -620,19 +754,19 @@ msgstr "" "Sichern Sie die Website %s zuerst als HTML Datei und benutzen Sie dann " "html2lrf mit der gespeicherten HTML Datei." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "Konnte Umschlagbild nicht lesen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "Lesen nicht möglich von: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Verarbeitung der OPF Datei schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -650,7 +784,7 @@ msgstr "" "lokale Dateien verweisen. Somit können Sie es verwenden,\n" "um einen ganzen Verzeichnisbaum von HTML Dateien zu konvertieren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -705,11 +839,11 @@ msgstr "Pfad zur Zieldatei" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 msgid "Verbose processing" -msgstr "Mit mehr Wörtern fortfahren" +msgstr "Ausführlicher fortfahren" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 msgid "Convert LRS to LRS, useful for debugging." -msgstr "Konvertierung von LRS in LRS, hilfreich bei der Fehlersuche." +msgstr "Konvertierung von LRS zu LRS, hilfreich bei der Fehlersuche." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455 msgid "Invalid LRF file. Could not set metadata." @@ -835,7 +969,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 msgid "Be more verbose." -msgstr "Mehr Wörter benutzen!" +msgstr "Noch ausführlicher!" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 msgid "You must specify a single PDF file." @@ -873,12 +1007,13 @@ msgstr "Gebe Autoren ein" msgid "Set the comment" msgstr "Gebe Kommentar ein" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "dateiname.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" +msgstr "" +"Eine durch Kommata getrennte Liste von Etiketten, die angewendet werden " +"sollen" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "Benutzung:" @@ -953,11 +1088,11 @@ msgstr "" "Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com " "abrufen\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "Benutzung: %s dateiname.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "Umschlagbild gespeichert unter" @@ -969,22 +1104,14 @@ msgstr "Benutzung: pdf-meta dateiname.pdf" msgid "No filename specified." msgstr "Kein Dateiname angegeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "%prog [options] dateiname.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "Original MOBI HTML gespeichert in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "OEB eBook erstellt in" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -998,13 +1125,14 @@ msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Bemerkung" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "Dialog" @@ -1019,6 +1147,52 @@ msgstr "TextLabel" msgid "Choose Format" msgstr "Format wählen" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" +"Voreinstellungen für die Konvertierung von Comics (CBR/CBZ Dateien) setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "Einstellungen für das Konvertieren &s setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "&Titel:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "&Autor(en):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "A&nzahl der Farben:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Profil:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "&Normalisieren deaktivieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "Verhältnis &beibehalten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "&Schärfen deaktivieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "&Querformat" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "Nicht sortieren" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "Einfach" @@ -1027,52 +1201,53 @@ msgstr "Einfach" msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
          Must be a directory." msgstr "
          Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
          Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.
          Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "Komprimiere Datenbank. Das kann etwas dauern..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "Komprimiere Datenbank..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Konfiguration" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "Speicherort der Bücherdatenbank (&library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Zu einem neuen Ort der Datenbank wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1086,27 +1261,37 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "&Römische Ziffern für Serien Nummerierung verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" +"A&nzahl der Umschlagbilder, die (nach einem Neustart) in der Cover-Ansicht " +"angezeigt werden:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "Benachrichtigung anzeigen, wenn &neue Version verfügbar ist" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "Nach einer Bestätigung vor dem Löschen von Dateien fragen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "Format zur &Speicherung einer Datei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "&Priorität der Konvertierungsaufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "Voreinstellung für Zei&tüberschreitung bei Netzwerkverbindungen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -1114,61 +1299,61 @@ msgstr "" "Voreinstellung der Zeitüberschreitung für Netzwerkabrufe festsetzen (Gilt " "immer dann, wenn aus dem Internet Informationen abgerufen werden sollen)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " Sekunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "Groß" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "Mittel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "Klein" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "&Größe der Schaltflächen in der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "Zeige &Text in Schaltflächen der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Häufig benutzte Verzeichnisse" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" "Ein Verzeichnis zur Liste der häufig genutzten Verzeichnisse hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" "Ein Verzeichnis von der Liste der häufig genutzten Verzeichnisse entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "Freier unbenutzter Festplattenspeicher der Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "Datenbank &komprimieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "&Meta-Daten aus dem Dateinamen" @@ -1311,7 +1496,6 @@ msgid "Convert %s to LRF" msgstr "Konvertiere %s in LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Voreinstellungen zur Konvertierung wählen" @@ -1413,17 +1597,17 @@ msgid "Options" msgstr "Auswahlmöglichkeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Umschlagbild" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." @@ -1432,25 +1616,25 @@ msgid "Use cover from &source file" msgstr "Um&schlagbild der Quelldatei verwenden" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Titel: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Autor(en): " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1464,24 +1648,24 @@ msgstr "So&rtierung nach Autor:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Herausgeber: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Herausgeber dieses Buches ändern" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "&Etiketten: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

          They can be any words or phrases, separated by commas." @@ -1492,7 +1676,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Serien:" @@ -1500,20 +1684,20 @@ msgstr "&Serien:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Serien. Sie können neue Serien hinzufügen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Index der Serien." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Buch " @@ -1591,10 +1775,6 @@ msgstr "&Kopfzeilenformat:" msgid "Override
          CSS" msgstr "CSS
          überschreiben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Profil:" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Rand:" @@ -1699,17 +1879,17 @@ msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Meta-Informationen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1718,19 +1898,19 @@ msgstr "" "Dickens\" zum Beispiel als \"Dickens, Charles\"." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Bewertung:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " Sterne" @@ -1740,8 +1920,8 @@ msgstr "&Etiketten hinzufügen: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" @@ -1752,9 +1932,10 @@ msgstr "Etiketten entfe&rnen:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131 msgid "Comma separated list of tags to remove from the books. " msgstr "" -"Durch getrennte Liste der Etiketten, die von den Büchern entfernt werden. " +"Durch Kommata getrennte Liste der Etiketten, die von den Büchern entfernt " +"werden. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

          Enter your username and password for LibraryThing.com.
          If you " "do not have one, you can register " @@ -1764,61 +1945,65 @@ msgstr "" "LibraryThing.com an.
          Insofern Sie dies nicht besitzen, können " "Sie sich kostenlos anmelden!

          " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
          " msgstr "Konnte kein Umschlagbild abrufen.
          " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "Konnte kein Umschlagbild abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "Kann kein Umschlagbild abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Sie müssen die ISBN für dieses Buch angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "Tausche Autor und Titel" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Serien entfernen (Serien ohne Bücher)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Meta-Daten vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Umschlagbild vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Benutzername und/oder Passwort Ihres Kontos bei LibraryThing.com ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Passwort ändern" @@ -2396,11 +2581,11 @@ msgstr "eBook öffnen" msgid "Configure" msgstr "Konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

          For help visit %s.kovidgoyal.net
          " @@ -2408,42 +2593,42 @@ msgstr "" "

          Hilfe gibt es online bei %s.kovidgoyal.net
          " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
          %%(device)s

          " msgstr "%s: %s von Kovid Goyal %%(version)s
          %%(device)s

          " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "An Speicherkarte senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "und aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "Auf die Speicherkarte senden (Voreinstellung)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Meta-Daten einzeln bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Meta-Daten auf einmal bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2451,7 +2636,7 @@ msgstr "" "Bücher rekursiv hinzufügen (Ein Buch pro Verzeichnis, setzt voraus, dass " "jede eBook Datei das gleiche Buch in einem unterschiedlichen Format enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2459,53 +2644,61 @@ msgstr "" "Bücher rekursiv hinzufügen (Mehrere Bücher pro Verzeichnis, setzt voraus, " "dass jede eBook Datei ein anderes Buch enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" -msgstr "Auf Festplatte sichern" +msgstr "Auf Festplatte speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" -msgstr "Speichere nur das %s Format auf die Festplatte" +msgstr "Nur das %s Format auf Festplatte speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "Spezielles Format ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Einzeln konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Auf einmal konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "Voreinstellungen für die Konvertierung zu LRF Dateien setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "Voreinstellungen für die Konvertierung von Comics setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "Angeschlossen: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "Gerätedatenbank ist beschädigt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

          The database of books on the reader is corrupted. Try the " @@ -2536,8 +2729,8 @@ msgstr "" " \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

          Books with the same title as the following already exist in the database. " "Add them anyway?

            " @@ -2545,53 +2738,60 @@ msgstr "" "

            Es existieren bereits Bücher mit dem selben Titel in der Datenbank. " "Sollen die folgenden Bücher trotzdem hinzugefügt werden?

              " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "Duplikate gefunden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "Lade Bücher auf das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

              Cannot upload books to device there is no more free space available " msgstr "" "

              Es können keine Bücher mehr auf das Gerät geladen werden, da der " "Gerätespeicher voll ist " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "Bestätigen Sie das Löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "Sind Sie sicher, dass Sie diese %d Bücher löschen wollen?" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "Lösche Bücher vom Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "Kann Metadaten nicht bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Keine Bücher ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                %s
              " @@ -2599,11 +2799,11 @@ msgstr "" "Die folgenden Bücher konnten nicht auf das Gerät geladen werden, da keine " "geeigneten Formate vorhanden sind:
                %s
              " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "Speichern auf Festplatte nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

              Could not save the following books to disk, because the %s format is not " "available for them:

                " @@ -2611,68 +2811,95 @@ msgstr "" "

                Die folgenden Bücher konnten nicht auf die Festplatte gespeichert werden, " "da das %s Format für sie nicht verfügbar ist:

                  " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "Konnte einige eBooks nicht speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "Nachrichten abrufen von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "Rufe Nachrichten ab von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "Nachrichten abgerufen. Übertragung ans Gerät läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "Konvertierung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "Starte Massenkonvertierung von %d Büchern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "Konvertiere Buch %d von %d (%s)" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                  Could not convert %d of %d books, because no suitable source format was " +"found.

                    %s
                  " +msgstr "" +"

                  Konnte %d von %d Büchern nicht konvertieren, da kein brauchbares " +"Ursprungsformat gefunden werden konnte.

                    %s
                  " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "Konnte einige Bücher nicht konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "Konvertiere Comic %d von %d (%s)" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "Buch konvertieren: " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "Comic konvertieren: " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "Ansehen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "Format zur Vorschau wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "%s hat keine verfügbaren Formate." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "Konfiguration nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "Konfiguration nicht möglich während Aufträge abgearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "Kopiere Datenbank nach " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "Ungültige Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                  An invalid database already exists at %s, delete it before trying to move " "the existing database.
                  Error: %s" @@ -2680,23 +2907,23 @@ msgstr "" "

                  Es existiert bereits eine ungültige Datenbank in %s, bitte löschen Sie " "diese, bevor sie die bestehende Datenbank verschieben.
                  Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "Konnte Datenbank nicht verschieben" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "Es ist keine weitere Information verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "Es ist keine weitere Information über Bücher auf dem Gerät verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2704,15 +2931,15 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "Datenbank existiert nicht" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2720,7 +2947,7 @@ msgstr "" "Das Verzeichnis, in dem die Datenbank sein sollte: %s existiert nicht mehr. " "Bitte wählen Sie einen neuen Ort für die Datenbank aus." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" @@ -2728,7 +2955,7 @@ msgstr "" "Letzte Version: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " @@ -2738,7 +2965,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">neuen Features an. " "Möchten Sie die Download Seite besuchen?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "Neue Version verfügbar" @@ -2862,23 +3089,23 @@ msgstr "" msgid "Custom news sources" msgstr "Individuelle Nachrichtenquellen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Aufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "Ein Klick zeigt die aktiven Aufträge." -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "Klicken Sie, um die Bücher in der Cover-Ansicht zu durchsuchen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "Klicken Sie, um die Cover-Ansicht zu verlassen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                  Browsing books by their covers is disabled.
                  Import of pictureflow " "module failed:
                  " @@ -2992,7 +3219,7 @@ msgstr "Ungültige Felder. Verfügbare Felder:" msgid "Invalid sort field. Available fields:" msgstr "Ungültiges Sortierungs-Feld. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -3000,7 +3227,7 @@ msgstr "" "Die folgenden Bücher wurden nicht hinzugefügt, da sie schon in der Datenbank " "vorhanden sind (siehe --duplicates Option):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -3014,7 +3241,7 @@ msgstr "" "Verzeichnisse angeben, sehen Sie sich dazu die zu den Verzeichnissen " "gehörigen Optionen weiter unten an. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -3023,11 +3250,11 @@ msgstr "" "und alle Dateien in diesem Verzeichnis sind verschiedene eBook Formate " "dieses einzelnen Buches" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "Verzeichnisse rekursiv verarbeiten" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -3035,12 +3262,12 @@ msgstr "" "Füge Bücher zur Datenbank hinzu, auch wenn diese schon vorhanden sind. Der " "Abgleich erfolgt aufgrund des Titels der Bücher." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" "Sie müssen wenigstens eine Datei auswählen, die hinzugefügt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -3055,11 +3282,11 @@ msgstr "" "(Sie erhalten die ID Zahlen durch die Benutzung des Befehls list). Zum " "Beispiel: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "Sie müssen wenigstens ein Buch auswählen, das entfernt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -3073,15 +3300,15 @@ msgstr "" "gekennzeichneten logischen Buches hinzu. Sie erhalten die ID durch den list " "Befehl. Falls das Format schon vorhanden ist, wird es ersetzt.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "Sie müssen eine ID und eine eBook Datei angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "eBook Datei muss eine Endung haben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -3098,11 +3325,11 @@ msgstr "" "eine Dateiendung wie LRF oder TXT oder EPUB sein. Falls das logische Buch im " "entsprechenden Format nicht vorliegt, passiert gar nichts.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "Sie müssen eine ID und ein Format (Dateiendung) angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3118,15 +3345,15 @@ msgstr "" "die ID erkannte Buch. \n" "\"id\" ist eine ID Nummer des Befehls \"list\". \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "Drucke Meta-Daten als OPF (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "Sie müssen eine ID angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3148,11 +3375,11 @@ msgstr "" "einen Eindruck über das OPF Format, wenn Sie die --as-opf Option mit dem \n" "Befehl show_metadata verwenden.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "Geben Sie eine ID und eine Meta-Daten Datei an" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3170,29 +3397,29 @@ msgstr "" "Daten (in \n" "einer OPF Datei). Sie erhalten ID Nummern mit dem Befehl \"list\". \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" "Exportiere alle Bücher der Datenbank, die Liste der IDs wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "Exportiere Bücher in das angegebene Verzeichnis. Voreinstellung ist" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "Exportiere alle Bücher in ein einziges Verzeichnis" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" "Erstelle Dateinamen mit \"Autor - Titel\" anstelle von \"Titel - Autor\"" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "Sie müssen IDs oder die %s Option angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3213,11 +3440,11 @@ msgstr "" " \n" "Für Hilfe zu einem bestimmten Befehl (command): %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "Konnte Arbeitsprozess nicht starten." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "Konnte die fontconfig library nicht initialisieren" @@ -3309,7 +3536,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 msgid "Be more verbose while processing." -msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." +msgstr "Noch ausführlicher bei der weiteren Verarbeitung vorgehen." #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 msgid "" @@ -3351,7 +3578,7 @@ msgstr "Fortschrittsbalken nicht anzeigen" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 msgid "Very verbose output, useful for debugging." -msgstr "Ausführliche Ausgabe, hilfreich zur Fehlerbeseitigung." +msgstr "Sehr ausführliche Ausgabe, hilfreich bei der Fehlersuche." #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 msgid "" @@ -3361,9 +3588,8 @@ msgstr "" "Hilfreich zur Entwicklung von Rezepten. Erzwingt maximal 2 Artikel pro Feed " "und lädt höchstens 2 Feeds." -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "Rufe Feeds ab..." @@ -3392,41 +3618,41 @@ msgstr "Der Download von Teilen der folgenden Artikel schlug fehl:" msgid "\tFailed links:" msgstr "\tFehlgeschlagene Verknüpfungen:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" "Konnte Artikel nicht abrufen. Der erneute Start mit --debug zeigt mögliche " "Gründe an" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "Feeds der Index Seite erhalten" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "Versuche Umschlagbild zu laden..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "Starte Download von [%d Thread(s)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "Feeds wurden nach %s heruntergeladen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "Konnte Umschlagbild nicht laden: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "Lade Umschlagbild von %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "Artikel ohne Titel" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" @@ -3436,19 +3662,19 @@ msgstr "" "Artikel %s von %s geladen\n" "%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "Artikel geladen: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "Laden der Artikel fehlgeschlagen: %s von %s\n" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "Laden der Artikel schlug fehl: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "Rufe Feed ab" diff --git a/src/calibre/translations/el.po b/src/calibre/translations/el.po index 78d25c33fc..e40222a49f 100644 --- a/src/calibre/translations/el.po +++ b/src/calibre/translations/el.po @@ -7,34 +7,52 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-06-24 07:23+0000\n" "Last-Translator: Thanos Petkakis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Δημιουργήθηκε απο τον " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "" @@ -46,14 +64,17 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Άγνωστο" @@ -315,7 +336,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -326,10 +347,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -338,7 +441,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -346,11 +449,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -363,95 +470,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -462,7 +569,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -644,12 +751,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -706,11 +812,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -722,22 +828,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -751,13 +849,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -772,6 +871,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -780,52 +924,53 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                  Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                  Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -839,85 +984,93 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1049,7 +1202,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "" @@ -1140,17 +1292,17 @@ msgid "Options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" @@ -1159,25 +1311,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1189,24 +1341,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                  They can be any words or phrases, separated by commas." @@ -1214,7 +1366,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "" @@ -1222,20 +1374,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "" @@ -1313,10 +1465,6 @@ msgstr "" msgid "Override
                  CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -1411,36 +1559,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr "" @@ -1450,8 +1598,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1463,67 +1611,71 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                  Enter your username and password for LibraryThing.com.
                  If you " "do not have one, you can register " "for free!.

                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 -msgid "IS&BN:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "" @@ -2068,110 +2220,118 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                  For help visit %s.kovidgoyal.net
                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                  %%(device)s

                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                  The database of books on the reader is corrupted. Try the " @@ -2187,190 +2347,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                  Books with the same title as the following already exist in the database. " "Add them anyway?

                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                    Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                      %s
                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                    Could not save the following books to disk, because the %s format is not " "available for them:

                      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                      Could not convert %d of %d books, because no suitable source format was " +"found.

                        %s
                      " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                      An invalid database already exists at %s, delete it before trying to move " "the existing database.
                      Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2483,23 +2675,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                      Browsing books by their covers is disabled.
                      Import of pictureflow " "module failed:
                      " @@ -2588,13 +2780,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2603,27 +2795,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2632,11 +2824,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2645,15 +2837,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2663,11 +2855,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2677,15 +2869,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2698,11 +2890,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2713,27 +2905,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2745,11 +2937,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2858,9 +3050,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2889,58 +3080,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index bda7df14d3..5e244c9bcf 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-12 01:40+0000\n" -"Last-Translator: betatron \n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-07-27 19:27+0000\n" +"Last-Translator: S. Dorscht \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -63,6 +63,9 @@ msgstr "" #~ "fuents, familia\" ( --serif-family \"%s, Times New Roman\")\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "milibro.epub" + #~ msgid "&Access Key;" #~ msgstr "Clave de &acceso;" @@ -180,24 +183,42 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif'; font-size:9pt;\">

                      " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Creado por " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "No se ha podido detectar la unidad de disco %s. Trate de reiniciar." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "El lector no tiene ninguna tarjeta de almacenamiento conectada" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "%prog [options] LITFILE" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "Directorio de salida. Por defecto es el directorio actual" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Útil para depuración." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "Ebook OEB creado en" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Establecer título. Por defecto: nombre_del_archivo" @@ -211,14 +232,17 @@ msgstr "" "Por defecto: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Desconocido" @@ -426,7 +450,6 @@ msgstr "" "Expressión regular utilizada para detectar los títulos de los capítulos. " "Busca las marcas de encabezado (h1-h6). Por defecto: %default" -# (pofilter) escapes: escapes in original ('"h\d,class,chapter".') don't match escapes in translation () #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:165 msgid "" "Detect a chapter beginning at an element having the specified attribute. The " @@ -552,7 +575,7 @@ msgstr "" "es cp-1252. Otra opción habitual es utf-8. La opción por defecto es intentar " "adivinar la codificación." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -565,10 +588,92 @@ msgstr "" "any2lrf [optiones] miarchivo\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "No se ha especificado ningun fichero para convertir" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -581,7 +686,7 @@ msgstr "" " \n" "%prog converte mybook.epub a mybook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -593,11 +698,16 @@ msgstr "" "\n" "%prog converte mybook.fb2 a mybook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Imprimir el HTML generado por la salida estándar y salir." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" +"Guardar archivos generados HTML después de completar la conversión a la LRF." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Opciones para controlar el comportamiento de feeds2disk" @@ -610,56 +720,56 @@ msgstr "Opciones para controlar el comportamiento de html2rtf" msgid "Fetching of recipe failed: " msgstr "Obtención fallida de la receta: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "\tBook Designer archivo detectado." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tAnalizando HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen archivo detectado. Volver a analizar..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "HTML preprocesado escrito en " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Procesando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tConversión a BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "No se pudo analizar el archivo: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%s es un archivo vacío" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "No se pudo analizar el enlace %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "No se puedo añadir el enlac %s al TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Incapaz de procesar imagen %s. Error: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "Incapaz de procesar PNG entrelazado %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -667,14 +777,14 @@ msgstr "" "No se puedo procesar imagen: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ocurrió un error al procesar la tabla: %s. Se ignora la identificación de la " "tabla." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -682,11 +792,11 @@ msgstr "" "Tabla errónea:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "La tabla contiene una celda demasiado larga" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -694,19 +804,19 @@ msgstr "" "Primero debe guardar la página web %s como un archivo html y después " "ejecutar html2rtf sobre él." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "No se puedo leer la imagen de portada: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "No se puedo leer de: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Incapaz de procesar el archivo opf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -725,7 +835,7 @@ msgstr "" "De esta forma, puede usarlo para convertir un \n" "árbol completo de archivos HTML." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -784,7 +894,7 @@ msgstr "Procesado detallado" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 msgid "Convert LRS to LRS, useful for debugging." -msgstr "Convierte LRS a LRS, útil para depurar." +msgstr "Convierte LRS a LRS, útil para depuración." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455 msgid "Invalid LRF file. Could not set metadata." @@ -941,12 +1051,11 @@ msgstr "Introduzca los autores" msgid "Set the comment" msgstr "Vea el comentario" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "milibro.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "Uso:" @@ -1018,11 +1127,11 @@ msgstr "" "Adquiere una portada para el libro identificado por el ISBN en " "LibraryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "Uso: %s archivo.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "Portada guardada en" @@ -1034,22 +1143,14 @@ msgstr "Uso: pdf-meta archivo.pdf" msgid "No filename specified." msgstr "Nombre de archivo sin especificar." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "%prog [opciones] miebook.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "Directorio de salida. Por defecto es el directorio actual" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "HTML MOBI en bruto guardado en" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "Ebook OEB creado en" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -1063,13 +1164,14 @@ msgstr "Título" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Comentarios" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "Diálogo" @@ -1084,6 +1186,51 @@ msgstr "TextLabel" msgid "Choose Format" msgstr "Elegir formato" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Perfil:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "Básico" @@ -1092,52 +1239,53 @@ msgstr "Básico" msgid "Advanced" msgstr "Avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                      Must be a directory." msgstr "
                      Debe ser un directorio." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Ubicación no válida " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Ubicación no válida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                      Cannot write to " msgstr "Ubicación no válida.
                      Imposible escribir en " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "Compactando base de datos. Esto podría durar un rato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "Compactando..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuración" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "&Ubicación de la base de datos (library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Navegar a la nueva ubicación de la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1151,27 +1299,35 @@ msgstr "Navegar a la nueva ubicación de la base de datos" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "Uso de numerales &romanos para números de serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "Mostrar aviso cuando una &nueva versión esté disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "Formato al guardar un &único archivo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "&Prioridad para los trabajos de conversión:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "&timeout por defecto de la red:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -1179,59 +1335,59 @@ msgstr "" "Establecer el tiempo de espera maximo para peticiones de red (cuando " "conectamos a internet para adquirir alguna información)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " segundos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "Barra de herramientas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "Grande" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "Medio" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "Pequeño" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "Tamaño de &botón en la barra de herramientas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "Mostrar &texto en los botones de la barra de herramientas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "Seleccione las &columnas visibles en la vista de biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Directorios usados con frecuencia" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "Añadir directorio a la lista de directorios frecuentes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "Eliminar directorio a la lista de directorios frecuentes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "Espacio de disco disponible de la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "&Compactar base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "&Metadatos a partir del nombre de archivo" @@ -1367,7 +1523,6 @@ msgid "Convert %s to LRF" msgstr "Convertir %s a LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Fijar valores de conversión por defecto" @@ -1466,17 +1621,17 @@ msgid "Options" msgstr "Opciones" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Portada" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "Cambia la imagen de &portada:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Localizar una imagen a utilizar como portada de este libro." @@ -1485,25 +1640,25 @@ msgid "Use cover from &source file" msgstr "Usar portada del archivo &fuente" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Título: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Cambiar el título del libro" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Autor(es): " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1517,24 +1672,24 @@ msgstr "O&rd&en por autor:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Editorial: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Cambia la editorial del libro" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "Etique&tas: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                      They can be any words or phrases, separated by commas." @@ -1544,7 +1699,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Series:" @@ -1552,20 +1707,20 @@ msgstr "&Series:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Listado de series conocidas. Se puede añadir nuevas series." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Índice de serie." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Libro " @@ -1643,10 +1798,6 @@ msgstr "&Formato del encabezado:" msgid "Override
                      CSS" msgstr "Substituye
                      CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Perfil:" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margen &Izquierdo:" @@ -1752,17 +1903,17 @@ msgid "Edit Meta information" msgstr "Editar Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "&Ordenar autores: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1771,19 +1922,19 @@ msgstr "" "Federico García Lorca como Lorca, Federico" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Valoración:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Valora este libro: 0-5 estrellas" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " estrellas" @@ -1793,8 +1944,8 @@ msgstr "Aña&dir las etiquetas: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Abrir editor de etiquetas" @@ -1806,7 +1957,7 @@ msgstr "&Quitar etiquetas" msgid "Comma separated list of tags to remove from the books. " msgstr "Lista de etiquetas separadas por comas para eliminar de los libros " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                      Enter your username and password for LibraryThing.com.
                      If you " "do not have one, you can register " @@ -1816,63 +1967,67 @@ msgstr "" "LibraryThing.com.
                      Si no dispone de una cuenta, puede regisrarse de manera gratuita.

                      " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                      " msgstr "No se puede descargar la portada.
                      " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "No se puede descargar la portada." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "No se puede descargar la portada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Especifique primero un ISBN válido para el libro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Editar meta-información" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "" "Eliminar series que no están en uso (series que no tienen ningún libro " "asociado)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Buscar metadatos en el servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Formatos disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Añadir un nuevo formato para este libro en la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina los formatos seleccionados para este libro de la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Buscar portada en el servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "Cambiar nombre de usuario y/o clave de tu cuenta de LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Cambiar contraseña" @@ -2112,7 +2267,6 @@ msgstr "&Compartir receta" msgid "&Load recipe from file" msgstr "&Cargar receta desde un archivo" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "" "\n" "

                      Crear una receta de " -"noticias básica, añadiendo un RSS Feed.
                      Para la mayoría de los feeds, " -"necesitará utilizar el \"modo avanzado\" para una configuración mas detallada " -"del proceso de adquisición de los datos

                      " +"noticias básica, añadiendo un RSS Feed.
                      Para la mayoría de los feeds, " +"necesitará utilizar el \"modo avanzado\" para una configuración mas " +"detallada del proceso de adquisición de los datos

                      " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "Recipe &title:" @@ -2254,7 +2409,6 @@ msgstr "Ninguna coincidencia" msgid "Authors:" msgstr "Autores:" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 msgid "Regular expression group name (?P)" msgstr "Nombre de grupo de expresión regular (?P)" @@ -2350,10 +2504,9 @@ msgstr "Formatos" msgid "Book %s of %s." msgstr "Libro %s de %s." -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 msgid "Double click to edit me

                      " -msgstr "Doble click para editarme

                      " +msgstr "Doble click para editarme" #: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:757 @@ -2450,11 +2603,11 @@ msgstr "Abrir eBook" msgid "Configure" msgstr "Configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Error en la comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                      For help visit %s.kovidgoyal.net
                      " @@ -2462,42 +2615,42 @@ msgstr "" "

                      Para mas ayuda, visite %s.kovidgoyal.net
                      " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                      %%(device)s

                      " msgstr "%s: %s by Kovid Goyal %%(version)s
                      %%(device)s

                      " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "Enviar a la memoria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "Enviar a la tarjeta de memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "y borrar de la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "enviar a la tarjeta de almacenamiento por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Editar metadatos individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Edita metadatos en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "añadir libros desde un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2505,7 +2658,7 @@ msgstr "" "Añadir libros de manera recursiva (un libro por directorio, asumiendo que " "cada archivo del directorio es el mismo libro en diferente formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2513,53 +2666,61 @@ msgstr "" "Añadir libros de manera recursiva (Multiples libros por directorio, " "asumiendo que cada archivo es un libro diferente)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Guardar en el disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "Guardar en el disco, en un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "Guardar solamente el formato %s en disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Mostrar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "Ver formato específico" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Convertir individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Convertir en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr " detectado." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "Conectado " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "Base de datos del dispositivo corrupta" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                      The database of books on the reader is corrupted. Try the " @@ -2589,8 +2750,8 @@ msgstr "" " \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                      Books with the same title as the following already exist in the database. " "Add them anyway?

                        " @@ -2598,52 +2759,59 @@ msgstr "" "

                        Ya existen libros con el mismo título en la base de datos. ¿Añadirlo de " "todas formas?

                          " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "¡Duplicados encontrados!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "No hay espacio en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                          Cannot upload books to device there is no more free space available " msgstr "" "

                          No se pueden guardar los libros porque no hay espacio en el dispositivo " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "Eliminando libros del dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "No se pueden editar los metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "No hay libros seleccionados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "No hay formatos adecuados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                            %s
                          " @@ -2651,11 +2819,11 @@ msgstr "" "No se pudieron enviar los siguientes libros al dispositivo, ya que no se " "hallaron formatos adecuados:
                            %s
                          " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "No se puede guardar en disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                          Could not save the following books to disk, because the %s format is not " "available for them:

                            " @@ -2663,68 +2831,93 @@ msgstr "" "

                            No se pudieron guardar los siguientes libros en disco, porque el formato " "%s no está disponible para ellos:

                              " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "No se pudieron guardar algunos ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "Busca noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "Buscando noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "Noticias adquiridas. Enviando al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "No se puede convertir" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "Comenzando conversión en lote de %d libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                              Could not convert %d of %d books, because no suitable source format was " +"found.

                                %s
                              " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Seleccione un libro" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "No se puede visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "Elija el formato para visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "%s no tiene formatos disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "No se puede configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "No se puede configurar con trabajos en proceso." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "Copiando base de datos a " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "Base de datos no valida" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                              An invalid database already exists at %s, delete it before trying to move " "the existing database.
                              Error: %s" @@ -2732,24 +2925,24 @@ msgstr "" "

                              Ya existe una base de datos no valida en %s, bórrela antes de intentar " "mover la base de datos existente.
                              Error: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "No se puede mover la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "No hay información detallada disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" "No hay información detallada disponible para los libros en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Error de comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2757,15 +2950,15 @@ msgstr "" "Hubo un error de comunicación con el dispositivo. Desconecte, vuelva a " "conectar el dispositivo y reinicie la aplicación." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "Error de conversión" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "No existe la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2773,7 +2966,7 @@ msgstr "" "El directorio en el que se debería encontrar la base de datos, %s ya no " "existe. Por favor seleccióne una nueva ruta para la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" @@ -2781,7 +2974,7 @@ msgstr "" "Última versión: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " @@ -2791,7 +2984,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuevas " "características. Visita la página de descarga?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "Actualización disponible" @@ -2901,7 +3094,6 @@ msgstr "ERROR: Excepción no Contemplada" msgid "Add a custom news source" msgstr "Añadir nueva fuente de noticias" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 msgid "" "

                              Please enter your username and password for %s
                              If you do not have one, " @@ -2915,23 +3107,23 @@ msgstr "" msgid "Custom news sources" msgstr "Nueva fuente de noticias personalizada" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Trabajos:" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "Haga click para ver los trabajos activos." -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "Haga click para explorar los libros por sus cubiertas" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "Haga click para desactivar la exploración de cubiertas" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                              Browsing books by their covers is disabled.
                              Import of pictureflow " "module failed:
                              " @@ -3043,7 +3235,7 @@ msgstr "Campos no válidos. Los campos disponibles:" msgid "Invalid sort field. Available fields:" msgstr "Campo de clasificación no válido. Los campos disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -3051,7 +3243,7 @@ msgstr "" "Los siguientes libros no se han añadido como ya existen en la base de datos " "(véase la opción --duplicates)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -3066,7 +3258,7 @@ msgstr "" "directorios, consulte las opciones relacionadas a los directorios más abajo. " "\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -3074,11 +3266,11 @@ msgstr "" "Supongamos que cada directorio tiene un solo libro lógico y que todos los " "archivos en este directorio son diferentes formatos de este libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "Proceso de directorios recursivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -3086,11 +3278,11 @@ msgstr "" "Añadir a base de datos de libros, aunque ya existen. La comparación se " "realiza sobre la base de títulos de libros." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "Debe especificar al menos un archivo para añadir" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -3105,11 +3297,11 @@ msgstr "" "números de identificación utilizando el commando \"list\"). Por ejemplo, " "23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "Debe especificar al menos un libro para eliminar" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -3123,15 +3315,15 @@ msgstr "" "identificado por iid. Puede obtener el id usando el comando list. Si el " "formato ya existe, será reemplazado por el nuevo.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "Debe especificar un ID y un ebook archivo" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "ebook archivo debe tener una extensión" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -3148,11 +3340,11 @@ msgstr "" "archivo como LRF o TXT o EPUB. Si el libro lógico no tiene fmt disponible, " "no hacer nada.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "Debe especificar un ID y un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3167,15 +3359,15 @@ msgstr "" "libro identificado por ID.\n" "Id es un número de identificador de la lista de comandos. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "Imprimir metadatos en formato OPF (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "Usted debe especificar un ID" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3198,11 +3390,11 @@ msgstr "" "el \n" "comando show_metadata.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "Usted debe especificar un ID y un archivo de metadatos" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3221,31 +3413,31 @@ msgstr "" "(en un archivo opf). Puede obtener los numeros id a partir del comando list. " "\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" "Exportar todos los libros en la base de datos, haciendo caso omiso de la " "lista de identificaciones." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" "Exportar libros para el directorio especificado. El valor por defecto es" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "Exportar todos los libros en un solo directorio" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" "Crear nombres de archivo como autor - título en lugar de título - autor" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "Debe especificar algunas identificaciones o la opción %s" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3264,11 +3456,11 @@ msgstr "" "command es uno de:\n" "%s\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "No se ha podido abrir el proceso trabajador." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "No se ha podido inicializar la biblioteca fontconfig" @@ -3415,9 +3607,8 @@ msgstr "" "Útil para desarrollo de recetas. Fuerza max_articles_per_feed a 2 y descarga " "2 feeds como máximo." -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "Buscando newsfeeds..." @@ -3446,41 +3637,41 @@ msgstr "Error al descargar partes de los siguientes artículos" msgid "\tFailed links:" msgstr "\tEnlaces erroneos:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" "No se pudo obtener el artículo. Ejecute con la opción --debug para encontrar " "la causa del fallo" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "Feeds obtenidos de página índice" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "Intentando descargar la portada" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "Iniciando la descarga [%d hilo(s)]" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "Feeds descargados a %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "No fué posible descargar la portada: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "Descargando portada desde %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "Artículo sin título" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" @@ -3490,19 +3681,19 @@ msgstr "" "Artículo %s descargado desde %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "Artículo descargado: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "No se ha podido descargar el artículo: %s de %s\n" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "Error en la descarga del artículo: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "Buscando newsfeed" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 10ad2888e1..3b47ccc75f 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-18 17:42+0000\n" -"Last-Translator: Tetsuo \n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-08-01 22:21+0000\n" +"Last-Translator: JVC \n" "Language-Team: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -59,6 +59,9 @@ msgstr "" #~ "famille\" Par exemple : --serif-family \"%s, Times New Roman\"\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "mybook.epub" + #~ msgid "Server error. Try again later." #~ msgstr "Erreur Serveur. Veuillez essayer ultérieurement." @@ -178,25 +181,45 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif';\">

                              " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sUsage%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Créé par " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 #, fuzzy msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Impossible de détecter le lecteur %s. Réessayer après redémarrage." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "Le lecteur n'a pas de carte de stockage connectée." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +#, fuzzy +msgid "Output directory. Defaults to current directory." +msgstr "Dossier de récupération. Par défaut, il s'agit du dossier actuel." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Utile pour déboguer" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +#, fuzzy +msgid "OEB ebook created in" +msgstr "OEB ebook créé dans" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 #, fuzzy msgid "Set the title. Default: filename." @@ -211,14 +234,17 @@ msgstr "" "Par défaut : %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Inconnu" @@ -519,11 +545,11 @@ msgstr "La famille de police monospace à inclure" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:210 msgid "Be verbose while processing" -msgstr "" +msgstr "Montrer les détails lors des traitements" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Convert to LRS" -msgstr "" +msgstr "Convertir en LRS" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "" @@ -541,8 +567,13 @@ msgid "" "files from windows computers is cp-1252. Another common choice is utf-8. The " "default is to try and guess the encoding." msgstr "" +"Spécifier l'encodage des caractères du fichier source. Si le fichier " +"contient des caractères étrangers, essayez en changeant cette option. " +"L'encodage couramment utilisé pour les fichiers venant de ordinateurs sous " +"Windows est le cp-1252. Cela peut aussi être l'utf-8. Le mieux est d'essayer " +"et deviner quel est l'encodage approprié." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -552,9 +583,105 @@ msgid "" "ZIP archive, looking for an ebook inside the archive.\n" " " msgstr "" +"any2lrf [options] myfile\n" +"\n" +"Convertir n'importe quel format d'ebook en LRF. Formats supportés:\n" +"LIT, RTF, TXT, HTML, EPUB, MOBI, PRC and PDF. any2lrf traitera les archives " +"RAR ou ZIP, en recherchant les ebooks à l'intérieur de l'archive.\n" +" " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." +msgstr "Aucun fichier sélectionné à convertir." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" +"Titre pour le livre électronique créé. Par défaut le nom de fichier sera " +"utilisé." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +#, fuzzy +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" +"Mettez le nom de l'auteur dans les données meta de l'ebook généré. Par " +"défaut, ce sera %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +#, fuzzy +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" +"Chemin vers le fichier LRF récupéré. par défaut, un fichier est créé dans le " +"répertoire actuel." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 @@ -564,20 +691,32 @@ msgid "" " \n" "%prog converts mybook.epub to mybook.lrf" msgstr "" +"Usage: %prog [options] mybook.epub\n" +" \n" +" \n" +"%prog convertit mybook.epub en mybook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" "\n" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" +"%prog [options] mybook.fb2\n" +"\n" +"\n" +"%prog convertit mybook.fb2 en mybook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Imprimer l'HTML généré en stdout et quitter" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "Conserver les fichiers HTML générés après conversion en LRF." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Options pour contrôler le comportement de feeds2disk" @@ -591,59 +730,59 @@ msgstr "Options pour contrôler le comportement de html2lrf" msgid "Fetching of recipe failed: " msgstr "Recherche des recettes échouées: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 #, fuzzy msgid "\tBook Designer file detected." msgstr "\tFichier Créateur de Livre détecté" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tAnalyse de l'HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 #, fuzzy msgid "\tBaen file detected. Re-parsing..." msgstr "\tFichier Baen détecté. Ré-analyse..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Traitement de %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tConversion en BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "Ne peut analyser le fichier: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%s est un fichier vide" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "Érreur d'analyse du lien %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "Ne peut ajouter le lien %s au TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Incapable de traiter l'image %s. Erreur: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 #, fuzzy msgid "Unable to process interlaced PNG %s" msgstr "Incapable de traiter les PNG entrelacés %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -651,7 +790,7 @@ msgstr "" "Ne peut traiter l'image: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 #, fuzzy msgid "" "An error occurred while processing a table: %s. Ignoring table markup." @@ -659,7 +798,7 @@ msgstr "" "Une erreur a surgit lors d'un traitement de table: %s. Ignore la table " "majorée" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -667,11 +806,11 @@ msgstr "" "Mauvaise table:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "La table a une cellule trop grande" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -679,19 +818,19 @@ msgstr "" "Vous devez tout d'abord sauvegarder le site web %s en fichier html, puis le " "lancer avec html2lrf." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "Ne peut lire l'image de couverture: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "Ne peut lire depuis: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Tentative de traitement du fichier opf échouée" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -709,7 +848,7 @@ msgstr "" "les fichiers locaux. Ainsi, vous pouvez l'utiliser pour \n" "convertir toute une arborescence de fichiers HTML." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -864,12 +1003,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:51 msgid " does not allow copying of text." -msgstr "" +msgstr " ne permet pas de copier du texte." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:54 msgid "" " is an image based PDF. Only conversion of text based PDFs is supported." msgstr "" +" est une image codée en PDF. Seule la conversion des textes est suportée " +"pour les PDFs." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:61 msgid "" @@ -878,6 +1019,10 @@ msgid "" "\n" "%prog converts mybook.pdf to mybook.lrf" msgstr "" +"%prog [options] mybook.pdf\n" +"\n" +"\n" +"%prog convertit mybook.pdf en mybook.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:402 msgid "" @@ -887,11 +1032,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 msgid "Be more verbose." -msgstr "" +msgstr "Détaillez plus." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 msgid "You must specify a single PDF file." -msgstr "" +msgstr "Vous devez sélectionner un seul fichier PDF." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/rtf/convert_from.py:20 msgid "" @@ -900,6 +1045,10 @@ msgid "" "\n" "%prog converts mybook.rtf to mybook.lrf" msgstr "" +"%prog [options] mybook.rtf\n" +"\n" +"\n" +"%prog convertit mybook.rtf en mybook.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:17 msgid "" @@ -908,23 +1057,26 @@ msgid "" "\n" "%prog converts mybook.txt to mybook.lrf" msgstr "" +"%prog [options] mybook.txt\n" +"\n" +"\n" +"%prog convertit mybook.txt en mybook.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23 msgid "Set the authors" -msgstr "" +msgstr "Configurer les auteurs." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27 msgid "Set the comment" +msgstr "Configurer les commentaires." + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" -msgstr "" +msgstr "Usage:" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" @@ -939,22 +1091,33 @@ msgid "" "isbndb.com.\n" "\n" msgstr "" +"\n" +"%prog [options] key\n" +"\n" +"Chercher les métadonnées sur isndb.com. Vous pouvez spécifier les \n" +"ISBN ID des livres ou leur titre et auteur. Si vous spécifiez le titre et " +"l'auteur,\n" +"il est possible que plus d'un livre vous sera retourné.\n" +"\n" +"clé est la clé du compte générée après inscription pour un compte gratuit " +"sur isbndb.com.\n" +"\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." -msgstr "" +msgstr "L'ISBN ID du livre dont vous désirez les métadonnées." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." -msgstr "" +msgstr "L'auteur du livre à chercher." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." -msgstr "" +msgstr "le titre du livre à chercher." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." -msgstr "" +msgstr "L'éditeur du livre à chercher." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:46 msgid "" @@ -971,7 +1134,7 @@ msgstr " pas trouvé." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:50 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:81 msgid "LibraryThing.com server error. Try again later." -msgstr "" +msgstr "Erreur du serveur LibraryThing.com. Veuillez réessayer plus tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:59 msgid "" @@ -980,39 +1143,36 @@ msgid "" "\n" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" +"\n" +"%prog [options] ISBN\n" +"\n" +"Chercher une image de couverture du livre identifié par ISBN sur " +"LibraryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" -msgstr "" +msgstr "Usage: %s file.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" -msgstr "" +msgstr "Couverture sauvée sur" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:36 msgid "Usage: pdf-meta file.pdf" -msgstr "" +msgstr "Usage: pdf-meta file.pdf" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:37 msgid "No filename specified." -msgstr "" +msgstr "Pas de nom de fichier spécifié." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" -msgstr "" +msgstr "%prog [options] myebook.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -1026,15 +1186,16 @@ msgstr "Titre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Commentaires" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" -msgstr "" +msgstr "Boîte de dialogue" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:57 @@ -1047,60 +1208,106 @@ msgstr "TextLabel" msgid "Choose Format" msgstr "Choisir le format" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Profil :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" -msgstr "" +msgstr "Mode Basique" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24 msgid "Advanced" -msgstr "" +msgstr "Mode avancé" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                              Must be a directory." msgstr "
                              Doit être un répertoire." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Chemin de la database invalide " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Chemin de la database invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                              Cannot write to " msgstr "Chemin de la database invalide.
                              Erreur en écriture " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuration" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "&Emplacement de la base de données (library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Choisir un nouvel emplacement pour la base de données" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1114,86 +1321,94 @@ msgstr "Choisir un nouvel emplacement pour la base de données" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "Utilisation de chiffres romains pour les numéro de séries" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -msgid "Show notification when &new version is available" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +msgid "Show notification when &new version is available" +msgstr "Envoyer une notification quand une nouvelle version est disponible." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "&Priorité pour les travaux de conversion :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "&Timeout par défaut pour les connexions réseau :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " secondes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" -msgstr "" +msgstr "Barre d'outils" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" -msgstr "" +msgstr "Large" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" -msgstr "" +msgstr "Moyen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" -msgstr "" +msgstr "Petit" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Répertoires utilisés fréquemment" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "Ajouter un répetoire à la liste des répertoires utilisés fréquemment" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" "Supprime un répetoire de la liste des répertoires utilisés fréquemment" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" -msgstr "" +msgstr "Espace libre non-utilisé de la base de données" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1210,11 +1425,11 @@ msgstr "Auteur(s)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:38 msgid "Author Sort" -msgstr "" +msgstr "Triage Auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:40 msgid "ISBN" -msgstr "" +msgstr "ISBN" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" @@ -1226,16 +1441,18 @@ msgstr "Vous devez spécifier une clef d'accès valide à isbndb.com" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 msgid "Error fetching metadata" -msgstr "" +msgstr "Erreur lors de la recherche de métadonnées" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" -msgstr "" +msgstr "Aucune métadonnée trouvée" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" +"Aucune métadonnée trouvée, essayer en modifiant le titre et l'auteur ou la " +"clé ISBN." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:77 msgid "Fetch metadata" @@ -1332,7 +1549,6 @@ msgid "Convert %s to LRF" msgstr "Conversion de %s en LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Définir les paramètres par défaut de conversion" @@ -1418,7 +1634,7 @@ msgstr "Aucune aide n'est disponible" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" -msgstr "" +msgstr "Bulk convertit les ebooks en LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" @@ -1433,17 +1649,17 @@ msgid "Options" msgstr "Options" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Couverture du livre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "Modifie l'image &cover :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Rechercher une image à utiliser en tant que couverture du livre." @@ -1452,25 +1668,25 @@ msgid "Use cover from &source file" msgstr "Utilise l'image de couverture du fichier &source" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Titre : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Modifie le titre du livre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Auteurs : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1484,24 +1700,24 @@ msgstr "T&ri de l'auteur :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Editeur : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Modifie l'éditeur du livre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "Ta&gs : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                              They can be any words or phrases, separated by commas." @@ -1511,7 +1727,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Séries :" @@ -1519,20 +1735,20 @@ msgstr "&Séries :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Liste de séries connues. Vous pouvez ajouter de nouvelles séries." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Index de séries" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Livre " @@ -1610,10 +1826,6 @@ msgstr "Format de l'&en-tête" msgid "Override
                              CSS" msgstr "Surcharge
                              CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Profil :" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Marge &Gauche :" @@ -1702,23 +1914,33 @@ msgid "" "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\">

                              " msgstr "" +"\n" +"\n" +"

                              " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 msgid "Edit Meta information" msgstr "Editer les informations Metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Informations (metadata)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "Clé de tr&i de l'auteur : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1727,19 +1949,19 @@ msgstr "" "Dickens peut être classé comme Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Note :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Note de ce livre. de 0 à 5 étoiles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " étoiles" @@ -1749,8 +1971,8 @@ msgstr "Ajout de Ta&gs : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Ouvre l'éditeur de mots-clefs" @@ -1762,7 +1984,7 @@ msgstr "&Supprime des mots-clefs :" msgid "Comma separated list of tags to remove from the books. " msgstr "Liste de mots-clefs séparés par des virgules à retirer des livres. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                              Enter your username and password for LibraryThing.com.
                              If you " "do not have one, you can register " @@ -1772,62 +1994,67 @@ msgstr "" "LibraryThing.com.
                              Si vous n'en avez pas, vous pouvez y créer un compte gratuitement !

                              " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                              " msgstr "Erreur à la récupération de l'image de couverture.
                              " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "Erreur à la récupération de l'image de couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "Erreur à la récupération de l'image de couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Vous devez fournir l'identifiant ISBN de ce livre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Edition des metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" +"Supprimer les séries inutilisées (Les séries qui ne possèdent aucun livres)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "I&SBN :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Récupération des metadata depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Ajout d'un nouveau format dans la base de données pour ce livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "Retire les formats sélectionnés de ce livre de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Récupération de l'image de couverture depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Modifie le nom d'utilisateur et/ou le mot de passe de votre compte à " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Modifie le mot de passe" @@ -1849,11 +2076,11 @@ msgstr "&Affiche le mot de passe" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:15 msgid "Author" -msgstr "" +msgstr "Auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:17 msgid "Tag" -msgstr "" +msgstr "Étiquette" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:251 @@ -1868,20 +2095,20 @@ msgstr "Format" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:21 msgid "Any" -msgstr "" +msgstr "Tous" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 msgid "Form" -msgstr "" +msgstr "Formulaire" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 msgid "contains" -msgstr "" +msgstr "contient" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 msgid "The text to search for. It is interpreted as a regular expression." -msgstr "" +msgstr "Le texte à chercher. Interprété comme une expression courante." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 msgid "" @@ -2375,110 +2602,122 @@ msgstr "Ouvrir le livre" msgid "Configure" msgstr "Configuration" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                              For help visit %s.kovidgoyal.net
                              " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                              %%(device)s

                              " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "Envoi vers la mémoire du lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "Envoi vers la carte mémoire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Edition des metadata individuellement" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Edition des metadata par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" +"Ajouter des livres récursivement (un livre par répertoire, assume que chaque " +"fichier correspond au même livre mais dans un format différent)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" +"Ajouter des livre récursivement (Plusieurs livres par répertoire, considère " +"que chaque fichier est un livre différent)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Convertion individuelle" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Convertion par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                              The database of books on the reader is corrupted. Try the " @@ -2494,8 +2733,8 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                              Books with the same title as the following already exist in the database. " "Add them anyway?

                                " @@ -2503,130 +2742,162 @@ msgstr "" "

                                Des livres ayant le même titre existent déjà dans la base de données. Les " "ajouter quand même ?

                                  " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "Des doublons ont été détectés !" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                  Cannot upload books to device there is no more free space available " msgstr "" "

                                  Impossible d'envoyer les livres sur le lecteur : il n'y a plus assez " "d'espace mémoire disponible " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "Erreur à l'édition des metadat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                    %s
                                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "Ne peut pas enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                  Could not save the following books to disk, because the %s format is not " "available for them:

                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" -msgstr "" +msgstr "Impossible de sauvegarder des livres électroniques" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "Conversion impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                    Could not convert %d of %d books, because no suitable source format was " +"found.

                                      %s
                                    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "Impossible de visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "Configuration impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "Impossible de configurer pendant que des travaux sont en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "Base de données invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                    An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                    Error: %s" @@ -2634,23 +2905,23 @@ msgstr "" "

                                    Une base de données invalide existe déjà ici : %s, spprimez la avant " "d'essayer de déplacer la base de données existante.
                                    Erreur : %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "Déplacement de la base de données impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2659,34 +2930,34 @@ msgstr "" "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "électronique et redémarrer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2769,7 +3040,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" -msgstr "Convertir des ebooks" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" @@ -2803,23 +3074,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Travaux :" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                    Browsing books by their covers is disabled.
                                    Import of pictureflow " "module failed:
                                    " @@ -2912,13 +3183,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2927,27 +3198,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2956,11 +3227,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2969,15 +3240,17 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 +#, fuzzy msgid "You must specify an id and an ebook file" msgstr "" +"Vous devez spécifier un identifiant et un fichier de livre électronique" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" -msgstr "" +msgstr "Les fichiers de livres électroniques doivent avoir une extension" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2987,11 +3260,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3001,15 +3274,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3022,11 +3295,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3037,27 +3310,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3069,11 +3342,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -3182,9 +3455,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -3213,58 +3485,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 1729b1a5e6..c60257f5d5 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-09 07:42+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-08-01 22:06+0000\n" "Last-Translator: Iacopo Benesperi \n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -63,6 +63,9 @@ msgstr "" #~ "family \"%s, Times New Roman\"\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "miolibro.epub" + #~ msgid "The author whoose book to search for." #~ msgstr "L'autore del libro da cercare" @@ -108,24 +111,42 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif'; font-size:9pt;\">

                                    " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Creato da " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Impossibile individuare il disco %s. Provare a riavviare." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "Il lettore non ha una scheda di memoria connessa." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "%prog [opzioni] FILELIT" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "Cartella in uscita. Predefinita: cartella corrente" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Utile per il debugging" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "Libro OEB creato in" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Imposta il titolo. Predefinito: nome del file" @@ -139,14 +160,17 @@ msgstr "" "Predefinito: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Sconosciuto" @@ -456,7 +480,7 @@ msgstr "La famiglia di caratteri a spaziatura fissa da includere" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:210 msgid "Be verbose while processing" -msgstr "Prolisso durante il processamento" +msgstr "Dettagliato durante il processamento" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Convert to LRS" @@ -482,7 +506,7 @@ msgstr "" "comune per i computer Windows è cp-1252. Un'altra scelta comune è utf-8. " "L'opzione predefinita è quella di provare ad indovinare la codifica" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -499,10 +523,106 @@ msgstr "" "archivio RAR o ZIP, cercando i libri dentro l'archivio.\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "Nessun file da convertire specificato" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "Trasformato %s" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "Titolo per il libro generato. Predefinito: nome del file." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" +"Imposta l'autore nei metadati del libro generato. Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" +"Percorso del file LRF in uscita. Predefinito: creazione del file nella " +"cartella corrente." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" +"Numero di colori per la conversione delle immagini in scala di grigi. " +"Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" +"Disabilita la normalizzazione dell'intervallo dei colori per le immagini " +"(migliora il contrasto). Predefinito: falso." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" +"Mantieni le proporzioni dell'immagine. Predefinito: riempimento dello " +"schermo." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "Disabilita maschera di nitidezza." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "Non dividere le immagini orizzontali in due immagini verticali" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" +"Non ordinare i file trovati nel fumetto alfabeticamente per nome. Usa invece " +"l'ordine in cui sono stati aggiunti al fumetto." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" +"Scegliere un profilo per il dispositivo per cui si sta generando il file " +"LRF. Predefinito: SONY PRS-500 con una risoluzione di 584x754 pixel. Le " +"scelte sono %s" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "Non visualizzare la barra di progresso." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "Trasformazione pagine fumetto..." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -515,7 +635,7 @@ msgstr "" " \n" "%prog converte miolibro.epub in miolibro.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -527,11 +647,16 @@ msgstr "" "\n" "%prog converte miolibro.fb2 in miolibro.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Invia l'HTML generato allo stdout ed esce" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" +"Mantieni i file HTML generati dopo aver completato la conversione in LRF." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Opzioni per controllare il comportamento di feeds2disk" @@ -544,56 +669,56 @@ msgstr "Opzioni per controllare il comportamento di html2lrf" msgid "Fetching of recipe failed: " msgstr "Scaricamento della formula fallito: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "\tFile di Book Designer individuato" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tAnalisi HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "\tFile di Baen individuato. Rianalizzo..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "HTML preprocessato scritto in " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Sto processando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tConversione in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "Impossibile analizzare il file: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%S è un file vuoto" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "Analisi fallita del link %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "Impossibile aggiungere il link %s alla TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Impossibile processare l'immagine %s. Errore: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "Impossibile processare la PNG interlacciata %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -601,14 +726,14 @@ msgstr "" "Impossibile processare l'immagine: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Si è verificato un errore nel processamento della tabella: %s. Ignoro il " "codice della tabella" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -616,11 +741,11 @@ msgstr "" "Tabella malformata:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "La tabella ha celle troppo larghe" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -628,19 +753,19 @@ msgstr "" "È necessario prima salvare il sito web %s come un file HTML e poi eseguire " "html2lrf su di esso" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "Impossibile leggere l'immagine di copertina: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "Impossibile leggere da: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Processamento del file OPF fallito" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -658,7 +783,7 @@ msgstr "" "che puntano a file locali. In questo modo è possibile\n" "usarlo per convertire un intero albero di file HTML" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -713,7 +838,7 @@ msgstr "Percorso del file in uscita" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 msgid "Verbose processing" -msgstr "Processamento prolisso" +msgstr "Processamento dettagliato" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 msgid "Convert LRS to LRS, useful for debugging." @@ -840,7 +965,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 msgid "Be more verbose." -msgstr "Più prolisso" +msgstr "Più dettagliato" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 msgid "You must specify a single PDF file." @@ -878,12 +1003,11 @@ msgstr "Imposta gli autori" msgid "Set the comment" msgstr "Imposta il commento" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "miolibro.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" +msgstr "Una lista separata da virgole di tag da impostare" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "Uso:" @@ -958,11 +1082,11 @@ msgstr "" "Scarica un'immagine di copertina per il libro identificato dall'ISBN da " "LibraryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "Uso: %s file.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "Copertina salvata in" @@ -974,22 +1098,14 @@ msgstr "Uso: pdf-meta-file.pdf" msgid "No filename specified." msgstr "Nessun nome file specificato" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "%prog [opzioni] miolibro.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "Cartella in uscita. Predefinita: cartella corrente" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "MOBI HTML raw salvato in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "Libro OEB creato in" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -1003,13 +1119,14 @@ msgstr "Titolo" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Commenti" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "Dialogo" @@ -1024,6 +1141,51 @@ msgstr "EtichettaDiTesto" msgid "Choose Format" msgstr "Scegliere il formato" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Profilo:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "Base" @@ -1032,52 +1194,53 @@ msgstr "Base" msgid "Advanced" msgstr "Avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                    Must be a directory." msgstr "
                                    Deve essere una cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Percorso database non valido " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Percorso database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                    Cannot write to " msgstr "Percorso database non valido.
                                    Impossibile scrivere su " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "Compattamento database. Poterbbe richiedere un po' di tempo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "Compattamento..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configurazione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "&Posizione del database dei libri (library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Sfoglia per specificare una nuova posizione del database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1091,27 +1254,37 @@ msgstr "Sfoglia per specificare una nuova posizione del database" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "&Usa numeri romani per i numeri delle serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" +"&Numero di copertine da visualizzare nella modalità di sfogliatura (richiede " +"riavvio):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "&Visualizza un avvertimento quando è disponibile una nuova versione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "&Chiedere conferma prima di eliminare i file" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "&Formato per salvataggio singolo file:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "Pri&orità per i lavori di conversione:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "&Timeout predefinito della rete:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -1119,59 +1292,59 @@ msgstr "" "Imposta il timeout predefinito per gli scaricamenti dalla rete (cioè ogni " "volta che si usa Internet per prelevare informazioni)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " secondi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "Barra degli strumenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "Grande" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "Media" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "Piccola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "&Dimensione bottoni nella barra degli strumenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "&Mostra testo nei bottoni della barra degli strumenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "&Selezionare le colonne visibili nella vista biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Cartelle usate frequentemente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "Aggiunge una cartella alla lista delle cartelle usate frequentemente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "Rimuove una cartella dalla lista delle cartelle usate frequentemente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "Libera lo spazio non utilizzato dal database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "&Compatta database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "&Metadati dal nome del file" @@ -1312,7 +1485,6 @@ msgid "Convert %s to LRF" msgstr "Converte %s in LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Impostazioni di conversione predefinite" @@ -1414,17 +1586,17 @@ msgid "Options" msgstr "Opzioni" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Copertina del libro" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "Ca&mbia l'immagine di copertina:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" "Sfoglia per trovare un'immagine da usare come copertina per questo libro" @@ -1434,25 +1606,25 @@ msgid "Use cover from &source file" msgstr "Usa copertina del file di &origine" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Titolo: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Cambia il titolo di questo libro" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "A&utore(i): " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1466,25 +1638,24 @@ msgstr "Classifica&zione autore:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Editore: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Cambia l'editore di questo libro" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "T&ag: " -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                    They can be any words or phrases, separated by commas." @@ -1495,7 +1666,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Serie:" @@ -1503,20 +1674,20 @@ msgstr "&Serie:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Lista di serie conosciute. È possibile aggiungere nuove serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Indice serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Libro " @@ -1594,10 +1765,6 @@ msgstr "&Formato intestazione:" msgid "Override
                                    CSS" msgstr "Sovrascrivi
                                    CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Profilo:" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margine &sinistro:" @@ -1703,17 +1870,17 @@ msgid "Edit Meta information" msgstr "Modifica metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "&Classificazione autore: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1722,19 +1889,19 @@ msgstr "" "esempio, Charles Dickens deve essere classificato come Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Giudizio:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Giudizio su questo libro. 0-5 stelle" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " stelle" @@ -1744,8 +1911,8 @@ msgstr "&Aggiungi tag: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Apri l'editor dei tag" @@ -1757,7 +1924,7 @@ msgstr "&Rimuovi tag:" msgid "Comma separated list of tags to remove from the books. " msgstr "Lista separata da virgole dei tag da rimuovere dal libro " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                    Enter your username and password for LibraryThing.com.
                                    If you " "do not have one, you can register " @@ -1767,61 +1934,65 @@ msgstr "" "
                                    Se non se ne possiede uno, è possibile registrarsi gratuitamente!

                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                    " msgstr "Impossibile scaricare la copertina
                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "Impossibile scaricare la copertina" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "Impossibile scaricare la copertina" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "È necessario specificare il codice ISBN di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Modifica metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "Scambia titolo e autore" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "Rimuovi serie inutilizzate (che non hanno libri)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Scarica metadati dal server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Formati disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Aggiungi un nuovo formato al database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "Rimuovi il formato selezionato dal database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Scarica immagine di copertina dal server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Cambia il nome utente e/o password del proprio account su LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Cambia password" @@ -2144,7 +2315,6 @@ msgstr "" msgid "Recipe source code (python)" msgstr "Codice sorgente formula (python)" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 msgid "" "

                                    Set a regular expression pattern to use when trying to guess ebook " @@ -2156,7 +2326,7 @@ msgstr "" "

                                    Impostare un modello di espressione regolare da usare nel tentativo di " "indovinare i metadati dei libri dal nome del file.

                                    È disponibile un riferimento sulla " -"sintassi delle espressioni regolari.

                                    Usare la funzionalità Test " +"sintassi delle espressioni regolari.

                                    Usare la funzionalità Test " "sottostante per testare le proprie espressioni regolari su una serie di nomi " "di file di esempio." @@ -2296,7 +2466,6 @@ msgstr "Formati" msgid "Book %s of %s." msgstr "Libro %s di %s" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 msgid "Double click to edit me

                                    " msgstr "Doppio clic per modificarmi

                                    " @@ -2395,11 +2564,11 @@ msgstr "Apri libro" msgid "Configure" msgstr "Configurazione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                    For help visit %s.kovidgoyal.net
                                    " @@ -2407,42 +2576,42 @@ msgstr "" "

                                    Per aiuto visitare %s.kovidgoyal.net
                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                    %%(device)s

                                    " msgstr "%s: %s di Kovid Goyal %%(version)s
                                    %%(device)s

                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "Invia alla memoria principale" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "Invia alla scheda di memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "e elimina dalla libreria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "Invia alla scheda di memoria come imposazione predefinita" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Modifica metadati individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Modifica metadati in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "Aggiungi libri da una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2450,7 +2619,7 @@ msgstr "" "Aggiungi libri ricorsivamente (un libro per cartella, assume che ogni file " "sia lo stesso libro in un diverso formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2458,53 +2627,61 @@ msgstr "" "Aggiungi libri ricorsivamente (più libri per cartella, assume che ogni file " "sia un libro diverso)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Salva su disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "Salva su disco in una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "Salva sul disco solo il formato %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Leggi" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "Leggi uno specifico formato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Converti individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Converti in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr " individuato." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "Connesso " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "Database del dispositivo corrotto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                    The database of books on the reader is corrupted. Try the " @@ -2533,8 +2710,8 @@ msgstr "" " \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                    Books with the same title as the following already exist in the database. " "Add them anyway?

                                      " @@ -2542,53 +2719,60 @@ msgstr "" "

                                      Nel database sono già presenti libri con i seguenti titoli. Aggiungerli " "ugualmente?

                                        " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "Scoperti duplicati!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "Caricamento libri nel dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Spazio insufficiente sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                        Cannot upload books to device there is no more free space available " msgstr "" "

                                        Impossibile salvare libri sul dispositivo perché non c'è più spazio " "disponibile " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "Conferma elininazione" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "Si è sicuri di voler eliminare questi %d libri?" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "Cancellamento libri dal dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "Impossibile modificare i metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "Invio libri al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "Nessun formato adatto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                          %s
                                        " @@ -2596,11 +2780,11 @@ msgstr "" "Impossibile caricare i seguenti libri nel dispositivo, perché non è stato " "trovato nessun formato adatto:
                                          %s
                                        " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "Impossibile salvare sul disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                        Could not save the following books to disk, because the %s format is not " "available for them:

                                          " @@ -2608,68 +2792,93 @@ msgstr "" "

                                          Impossibile salvare i libri seguenti su disco, perché il formato %s non è " "disponibile per loro:

                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "Impossibile salvare alcuni libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "Scarica notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "Scaricamento notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "Notizie scaricate. Salvataggio sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "Impossibile convertire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "Avviamento conversione in gruppo di %d libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                            Could not convert %d of %d books, because no suitable source format was " +"found.

                                              %s
                                            " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "Impossibile leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "Scegliere il formato da leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "%s non ha formati disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "Impossibile configurare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "Impossibile configurare mentre ci sono lavori in esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "Copiatura database in " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "Database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                            An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                            Error: %s" @@ -2677,25 +2886,25 @@ msgstr "" "

                                            Esiste già un database non valido in %s, eliminarlo prima di provare a " "spostare il database esistente.
                                            Errore: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "Impossibile spostare il database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "Nessuna informazione dettagliata disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" "Non è disponibile alcuna informazione dettagliata per i libri nel " "dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2703,15 +2912,15 @@ msgstr "" "Si è verificato un errore di comunicazione temporaneo col dispositivo. " "Disconnettere e riconnettere il dispositivo e/o riavviare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "Errore di conversione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "Il database non esiste" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2719,7 +2928,7 @@ msgstr "" "La cartella in cui il database dovrebbe essere: %s non esiste più. Scegliere " "una nuova posizione per il database." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" @@ -2727,7 +2936,7 @@ msgstr "" "Ultima versione: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " @@ -2737,7 +2946,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuove " "funzionalità. Una visita alla pagina del download?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "Aggiornamento disponibile" @@ -2859,23 +3068,23 @@ msgstr "" msgid "Custom news sources" msgstr "Fonti di notizie personalizzate" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Lavori:" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "Fare clic per vedere una lista dei lavori attivi" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "Fare clic per sfogliare i libri per copertine" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "Fare clic per disattivare la navigazione per copertina" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                            Browsing books by their covers is disabled.
                                            Import of pictureflow " "module failed:
                                            " @@ -2990,7 +3199,7 @@ msgstr "Campi non validi. Campi disponibili:" msgid "Invalid sort field. Available fields:" msgstr "Campo per l'ordinamento non valido. Campi disponibili:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2998,7 +3207,7 @@ msgstr "" "I seguenti libri non sono stati aggiunti perché già esistenti nel database " "(vedere l'opzione --duplicates):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -3012,7 +3221,7 @@ msgstr "" "cartelle, leggere\n" "le opzioni dedicate alle cartelle in basso. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -3020,21 +3229,21 @@ msgstr "" "Assume che ogni cartella abbia un solo libro logico e che tutti i file " "presenti siano diversi formati per quel libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "Processa cartelle ricorsivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "Aggiunge libri al database anche se esistono già." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "È necessario specificare almeno un file da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -3048,11 +3257,11 @@ msgstr "" "separata da virgole di numeri id (è possibile ottenere i numeri id usando il " "comando list). Ad esempio: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "È necessario specificare almeno un libro da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -3066,15 +3275,15 @@ msgstr "" "identificato da id. È possibile ottenere gli id usando il comando list. Se " "il formato esiste già, verrà sovrascritto.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "È necessario specificare un id e un file ebook" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "I file ebook devono avere un'estensione" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -3091,11 +3300,11 @@ msgstr "" "file come LRF, TXT o EPUB. Se il libro logico non ha un fmt disponibile, non " "fa niente.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "È necessario specificare un id e un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3111,15 +3320,15 @@ msgstr "" "da id. \n" "id è un numero id dalla lista dei comandi. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "Stampa i metafati in formato OPF (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "È necessario specificare un id" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3142,11 +3351,11 @@ msgstr "" "opf\n" "nel comando show_metadata.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "È necessario specificare un id e un file di metadati" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3165,28 +3374,28 @@ msgstr "" "e i metadati (in un file opf). È possibile prendere i dumeri di id dalla " "lista dei comandi. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "Esporta tutti i libri del database, ignorando la lista di id." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "Esporta i libri nella cartella specificata. Predefinita:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "Esporta tutti i libri in una singola cartell" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" "Crea i nomi dei file come \"autore - titolo\" invece di \"titolo - autore\"" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "È necessario specificare qualche id o l'opzione %s" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3202,11 +3411,11 @@ msgstr "" " \n" "Per aiuto su un singolo comando: %%prog comando --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "Impossibile avviare il gestore dei lavori." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "Impossibile inizializzare la libreria fontconfig" @@ -3298,7 +3507,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 msgid "Be more verbose while processing." -msgstr "Più prolisso durante il processamento" +msgstr "Più dettagliato durante il processamento" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 msgid "" @@ -3341,7 +3550,7 @@ msgstr "Non mostrare la barra di progresso" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 msgid "Very verbose output, useful for debugging." -msgstr "Output molto prolisso, utile per il debugging" +msgstr "Output molto dettagliato, utile per il debugging" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 msgid "" @@ -3351,9 +3560,8 @@ msgstr "" "Utile per lo sviluppo delle formule. Forza max_articles_per_feed a 2 e " "scarica al massimo 2 feed" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "Scaricamento feed..." @@ -3382,40 +3590,40 @@ msgstr "Scaricamento dei seguenti articoli fallito parzialmente:" msgid "\tFailed links:" msgstr "\tLink falliti:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" "Impossibile scaricare l'articolo. Eseguire con --debug per vedere la ragione" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "Ricevuti feed dalla pagina principale" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "Tentativo di scaricamento della copertina..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "Inizio scaricamento [%d articolo(i)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "Feed scaricati in %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "Impossibile scaricare la copertina: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "Scaricamento copertina da %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "Articolo senza titolo" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" @@ -3425,19 +3633,19 @@ msgstr "" "Scaricato articolo %s da %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "Articolo scaricato: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "Scaricamento fallito dell'articolo: %s da %s\n" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "Scaricamento fallito dell'articolo: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "Scaricamento feed" diff --git a/src/calibre/translations/nds.po b/src/calibre/translations/nds.po index 996225c8c1..9e00792b71 100644 --- a/src/calibre/translations/nds.po +++ b/src/calibre/translations/nds.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-09 06:12+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-08-04 13:01+0000\n" "Last-Translator: S. Dorscht \n" "Language-Team: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -49,6 +49,9 @@ msgstr "" #~ "Beispiel: --serif-family \"%s, Times New Roman\"\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "dateiname.epub" + #~ msgid "The author whoose book to search for." #~ msgstr "Der Autor des gesuchten Buches." @@ -94,24 +97,42 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif'; font-size:9pt;\">

                                            " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sBenutzung%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Erstellt von " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Konnte das Laufwerk %s nicht finden. Versuchen Sie einen Neustart." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "Im Reader ist keine Speicherkarte eingesteckt." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "%prog [options] LITFILE" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Hilfreich bei der Fehlersuche." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "OEB eBook erstellt in" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Geben Sie den Titel an. Voreinstellung: Dateiname." @@ -125,14 +146,17 @@ msgstr "" "angegeben werden. Voreinstellung: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Unbekannt" @@ -444,7 +468,7 @@ msgstr "Nichtproportionale Schriftartfamilie einbetten" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:210 msgid "Be verbose while processing" -msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." +msgstr "Bei der weiteren Verarbeitung ausführlicher vorgehen" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Convert to LRS" @@ -472,7 +496,7 @@ msgstr "" "cp-1252. Eine andere gebräuchliche Alternative ist utf-8. In der " "Voreinstellung wird versucht, die Kodierung zu erraten." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -491,10 +515,116 @@ msgstr "" "ZIP Archive, indem es nach einem eBook im Archiv sucht.\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "Keine Datei zur Konvertierung angegeben." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "%s gerendert." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" +"Einstellungen zur Kontrolle der Konvertierung von Comic (CBR, CBZ) Dateien " +"zu eBooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" +"Titel für erstelltes eBook. In der Voreinstellung wird der Dateiname benutzt." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" +"Gibt den Autor in den Metadaten des erstellen eBooks an. Voreinstellung ist " +"%default." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" +"Pfad zur ausgegebenen LRF Datei. Laut Voreinstellung wird die Datei im " +"aktuellen Verzeichnis erstellt." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" +"Anzahl der Farben für die Bildkonvertierung in Graustufen. Voreinstellung: " +"%default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" +"Deaktivieren der Normalisierung (verbessert den Kontrast) des Farbbereichs " +"für Bilder. Voreinstellung: False" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" +"Seitenverhältnis des Bildes beibehalten. Voreinstellung ist " +"bildschirmfüllende Darstellung." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "Schärfen deaktivieren." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "Bilder im Querformat nicht in zwei Bilder im Hochformat aufteilen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" +"Dateien, die im Comic gefunden wurden, nicht alphabetisch nach Namen " +"sortieren, sondern die Reihenfolge verwenden, in der sie zum Comic " +"hinzugefügt wurden." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" +"Wählen Sie ein Profil für das Gerät, für das Sie diese LRF Datei erstellen. " +"Die Voreinstellung ist der SONY PRS-500 mit einer Bildschirmgröße von " +"584x754 Punkten. Wahlmöglichkeiten sind %s" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" +"Ausführlicher, hilfreich zur Fehlersuche. Kann mehrmals angegeben werden um " +"eine größere Ausführlichkeit zu erreichen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "Fortschrittsbalken nicht anzeigen." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Konvertiert ein Comic einer CBZ oder CBR Datei in ein LRF eBook. \n" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "Rendere Seiten des Comics..." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "Ausgabe gespeichert unter" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -507,7 +637,7 @@ msgstr "" " \n" "%prog konvertiert dateiname.epub in dateiname.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -519,11 +649,15 @@ msgstr "" "\n" "%prog konvertiert dateiname.fb2 in dateiname.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Gebe erstellte HTML auf stdout aus und beende das Programm." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "Erstellte HTML Dateien nach vollzogener LRF Konvertierung behalten." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Einstellungen für feeds2disk" @@ -536,56 +670,56 @@ msgstr "Einstellungen für html2lrf" msgid "Fetching of recipe failed: " msgstr "Abruf des Rezepts misslungen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "\tBook Designer Datei erkannt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tAnalysiere HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen Datei erkannt. Analysiere erneut..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "Vorverarbeitetes HTML gespeichert unter " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Verarbeite %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tKonvertiere in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "Konnte Datei nicht analysieren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%s ist eine leere Datei" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "Fehlschlag bei der Analysierung von %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "Konnte Link %s nicht zu TOC hinzufügen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Konnte Bild %s nicht verarbeiten. Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "Konnte verschachteltes PNG %s nicht verarbeiten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -593,14 +727,14 @@ msgstr "" "Konnte Bild nicht verarbeiten: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ein Fehler trat während der Bearbeitung einer Tabelle auf: %s. " "Tabellenformat wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -608,11 +742,11 @@ msgstr "" "Schlechte Tabelle:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "Tabelle enthält Zelle, die zu groß ist" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -620,19 +754,19 @@ msgstr "" "Sichern Sie die Website %s zuerst als HTML Datei und benutzen Sie dann " "html2lrf mit der gespeicherten HTML Datei." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "Konnte Umschlagbild nicht lesen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "Lesen nicht möglich von: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Verarbeitung der OPF Datei schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -650,7 +784,7 @@ msgstr "" "lokale Dateien verweisen. Somit können Sie es verwenden,\n" "um einen ganzen Verzeichnisbaum von HTML Dateien zu konvertieren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -705,11 +839,11 @@ msgstr "Pfad zur Zieldatei" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 msgid "Verbose processing" -msgstr "Mit mehr Wörtern fortfahren" +msgstr "Ausführlicher fortfahren" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 msgid "Convert LRS to LRS, useful for debugging." -msgstr "Konvertierung von LRS in LRS, hilfreich bei der Fehlersuche." +msgstr "Konvertierung von LRS zu LRS, hilfreich bei der Fehlersuche." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455 msgid "Invalid LRF file. Could not set metadata." @@ -835,7 +969,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 msgid "Be more verbose." -msgstr "Mehr Wörter benutzen!" +msgstr "Noch ausführlicher!" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 msgid "You must specify a single PDF file." @@ -873,12 +1007,13 @@ msgstr "Gebe Autoren ein" msgid "Set the comment" msgstr "Gebe Kommentar ein" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "dateiname.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" +msgstr "" +"Eine durch Kommata getrennte Liste von Etiketten, die angewendet werden " +"sollen" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "Benutzung:" @@ -953,11 +1088,11 @@ msgstr "" "Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com " "abrufen\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "Benutzung: %s dateiname.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "Umschlagbild gespeichert unter" @@ -969,22 +1104,14 @@ msgstr "Benutzung: pdf-meta dateiname.pdf" msgid "No filename specified." msgstr "Kein Dateiname angegeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "%prog [options] dateiname.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "Original MOBI HTML gespeichert in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "OEB eBook erstellt in" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -998,13 +1125,14 @@ msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Bemerkung" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "Dialog" @@ -1019,6 +1147,52 @@ msgstr "TextLabel" msgid "Choose Format" msgstr "Format wählen" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" +"Voreinstellungen für die Konvertierung von Comics (CBR/CBZ Dateien) setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "Einstellungen für das Konvertieren &s setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "&Titel:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "&Autor(en):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "A&nzahl der Farben:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Profil:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "&Normalisieren deaktivieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "Verhältnis &beibehalten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "&Schärfen deaktivieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "&Querformat" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "Nicht sortieren" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "Einfach" @@ -1027,52 +1201,53 @@ msgstr "Einfach" msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                            Must be a directory." msgstr "
                                            Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                            Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.
                                            Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "Komprimiere Datenbank. Das kann etwas dauern..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "Komprimiere Datenbank..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Konfiguration" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "Speicherort der Bücherdatenbank (&library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Zu einem neuen Ort der Datenbank wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1086,27 +1261,37 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "&Römische Ziffern für Serien Nummerierung verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" +"A&nzahl der Umschlagbilder, die (nach einem Neustart) in der Cover-Ansicht " +"angezeigt werden:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "Benachrichtigung anzeigen, wenn &neue Version verfügbar ist" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "Nach einer Bestätigung vor dem Löschen von Dateien fragen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "Format zur &Speicherung einer Datei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "&Priorität der Konvertierungsaufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "Voreinstellung für Zei&tüberschreitung bei Netzwerkverbindungen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -1114,61 +1299,61 @@ msgstr "" "Voreinstellung der Zeitüberschreitung für Netzwerkabrufe festsetzen (Gilt " "immer dann, wenn aus dem Internet Informationen abgerufen werden sollen)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " Sekunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "Groß" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "Mittel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "Klein" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "&Größe der Schaltflächen in der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "Zeige &Text in Schaltflächen der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Häufig benutzte Verzeichnisse" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" "Ein Verzeichnis zur Liste der häufig genutzten Verzeichnisse hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" "Ein Verzeichnis von der Liste der häufig genutzten Verzeichnisse entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "Freier unbenutzter Festplattenspeicher der Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "Datenbank &komprimieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "&Meta-Daten aus dem Dateinamen" @@ -1311,7 +1496,6 @@ msgid "Convert %s to LRF" msgstr "Konvertiere %s in LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Voreinstellungen zur Konvertierung wählen" @@ -1413,17 +1597,17 @@ msgid "Options" msgstr "Auswahlmöglichkeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Umschlagbild" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." @@ -1432,25 +1616,25 @@ msgid "Use cover from &source file" msgstr "Um&schlagbild der Quelldatei verwenden" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Titel: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Autor(en): " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1464,24 +1648,24 @@ msgstr "So&rtierung nach Autor:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Herausgeber: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Herausgeber dieses Buches ändern" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "&Etiketten: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                            They can be any words or phrases, separated by commas." @@ -1492,7 +1676,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Serien:" @@ -1500,20 +1684,20 @@ msgstr "&Serien:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Serien. Sie können neue Serien hinzufügen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Index der Serien." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Buch " @@ -1591,10 +1775,6 @@ msgstr "&Kopfzeilenformat:" msgid "Override
                                            CSS" msgstr "CSS
                                            überschreiben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Profil:" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Rand:" @@ -1699,17 +1879,17 @@ msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Meta-Informationen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1718,19 +1898,19 @@ msgstr "" "Dickens\" zum Beispiel als \"Dickens, Charles\"." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Bewertung:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " Sterne" @@ -1740,8 +1920,8 @@ msgstr "&Etiketten hinzufügen: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" @@ -1752,9 +1932,10 @@ msgstr "Etiketten entfe&rnen:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131 msgid "Comma separated list of tags to remove from the books. " msgstr "" -"Durch getrennte Liste der Etiketten, die von den Büchern entfernt werden. " +"Durch Kommata getrennte Liste der Etiketten, die von den Büchern entfernt " +"werden. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                            Enter your username and password for LibraryThing.com.
                                            If you " "do not have one, you can register " @@ -1764,61 +1945,65 @@ msgstr "" "LibraryThing.com an.
                                            Insofern Sie dies nicht besitzen, können " "Sie sich kostenlos anmelden!

                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                            " msgstr "Konnte kein Umschlagbild abrufen.
                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "Konnte kein Umschlagbild abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "Kann kein Umschlagbild abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Sie müssen die ISBN für dieses Buch angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "Tausche Autor und Titel" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Serien entfernen (Serien ohne Bücher)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Meta-Daten vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Umschlagbild vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Benutzername und/oder Passwort Ihres Kontos bei LibraryThing.com ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Passwort ändern" @@ -2396,11 +2581,11 @@ msgstr "eBook öffnen" msgid "Configure" msgstr "Konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                            For help visit %s.kovidgoyal.net
                                            " @@ -2408,42 +2593,42 @@ msgstr "" "

                                            Hilfe gibt es online bei %s.kovidgoyal.net
                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                            %%(device)s

                                            " msgstr "%s: %s von Kovid Goyal %%(version)s
                                            %%(device)s

                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "An Speicherkarte senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "und aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "Auf die Speicherkarte senden (Voreinstellung)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Meta-Daten einzeln bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Meta-Daten auf einmal bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2451,7 +2636,7 @@ msgstr "" "Bücher rekursiv hinzufügen (Ein Buch pro Verzeichnis, setzt voraus, dass " "jede eBook Datei das gleiche Buch in einem unterschiedlichen Format enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2459,53 +2644,61 @@ msgstr "" "Bücher rekursiv hinzufügen (Mehrere Bücher pro Verzeichnis, setzt voraus, " "dass jede eBook Datei ein anderes Buch enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" -msgstr "Auf Festplatte sichern" +msgstr "Auf Festplatte speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" -msgstr "Speichere nur das %s Format auf die Festplatte" +msgstr "Nur das %s Format auf Festplatte speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "Spezielles Format ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Einzeln konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Auf einmal konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "Voreinstellungen für die Konvertierung zu LRF Dateien setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "Voreinstellungen für die Konvertierung von Comics setzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "Angeschlossen: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "Gerätedatenbank ist beschädigt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                            The database of books on the reader is corrupted. Try the " @@ -2536,8 +2729,8 @@ msgstr "" " \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                            Books with the same title as the following already exist in the database. " "Add them anyway?

                                              " @@ -2545,53 +2738,60 @@ msgstr "" "

                                              Es existieren bereits Bücher mit dem selben Titel in der Datenbank. " "Sollen die folgenden Bücher trotzdem hinzugefügt werden?

                                                " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "Duplikate gefunden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "Lade Bücher auf das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                Cannot upload books to device there is no more free space available " msgstr "" "

                                                Es können keine Bücher mehr auf das Gerät geladen werden, da der " "Gerätespeicher voll ist " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "Bestätigen Sie das Löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "Sind Sie sicher, dass Sie diese %d Bücher löschen wollen?" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "Lösche Bücher vom Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "Kann Metadaten nicht bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Keine Bücher ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                  %s
                                                " @@ -2599,11 +2799,11 @@ msgstr "" "Die folgenden Bücher konnten nicht auf das Gerät geladen werden, da keine " "geeigneten Formate vorhanden sind:
                                                  %s
                                                " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "Speichern auf Festplatte nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                Could not save the following books to disk, because the %s format is not " "available for them:

                                                  " @@ -2611,68 +2811,95 @@ msgstr "" "

                                                  Die folgenden Bücher konnten nicht auf die Festplatte gespeichert werden, " "da das %s Format für sie nicht verfügbar ist:

                                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "Konnte einige eBooks nicht speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "Nachrichten abrufen von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "Rufe Nachrichten ab von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "Nachrichten abgerufen. Übertragung ans Gerät läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "Konvertierung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "Starte Massenkonvertierung von %d Büchern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "Konvertiere Buch %d von %d (%s)" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                    Could not convert %d of %d books, because no suitable source format was " +"found.

                                                      %s
                                                    " +msgstr "" +"

                                                    Konnte %d von %d Büchern nicht konvertieren, da kein brauchbares " +"Ursprungsformat gefunden werden konnte.

                                                      %s
                                                    " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "Konnte einige Bücher nicht konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "Konvertiere Comic %d von %d (%s)" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "Buch konvertieren: " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "Comic konvertieren: " + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "Ansehen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "Format zur Vorschau wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "%s hat keine verfügbaren Formate." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "Konfiguration nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "Konfiguration nicht möglich während Aufträge abgearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "Kopiere Datenbank nach " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "Ungültige Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                    An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                    Error: %s" @@ -2680,23 +2907,23 @@ msgstr "" "

                                                    Es existiert bereits eine ungültige Datenbank in %s, bitte löschen Sie " "diese, bevor sie die bestehende Datenbank verschieben.
                                                    Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "Konnte Datenbank nicht verschieben" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "Es ist keine weitere Information verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "Es ist keine weitere Information über Bücher auf dem Gerät verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2704,15 +2931,15 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "Datenbank existiert nicht" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2720,7 +2947,7 @@ msgstr "" "Das Verzeichnis, in dem die Datenbank sein sollte: %s existiert nicht mehr. " "Bitte wählen Sie einen neuen Ort für die Datenbank aus." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" @@ -2728,7 +2955,7 @@ msgstr "" "Letzte Version: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " @@ -2738,7 +2965,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">neuen Features an. " "Möchten Sie die Download Seite besuchen?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "Neue Version verfügbar" @@ -2862,23 +3089,23 @@ msgstr "" msgid "Custom news sources" msgstr "Individuelle Nachrichtenquellen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Aufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "Ein Klick zeigt die aktiven Aufträge." -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "Klicken Sie, um die Bücher in der Cover-Ansicht zu durchsuchen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "Klicken Sie, um die Cover-Ansicht zu verlassen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                    Browsing books by their covers is disabled.
                                                    Import of pictureflow " "module failed:
                                                    " @@ -2992,7 +3219,7 @@ msgstr "Ungültige Felder. Verfügbare Felder:" msgid "Invalid sort field. Available fields:" msgstr "Ungültiges Sortierungs-Feld. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -3000,7 +3227,7 @@ msgstr "" "Die folgenden Bücher wurden nicht hinzugefügt, da sie schon in der Datenbank " "vorhanden sind (siehe --duplicates Option):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -3014,7 +3241,7 @@ msgstr "" "Verzeichnisse angeben, sehen Sie sich dazu die zu den Verzeichnissen " "gehörigen Optionen weiter unten an. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -3023,11 +3250,11 @@ msgstr "" "und alle Dateien in diesem Verzeichnis sind verschiedene eBook Formate " "dieses einzelnen Buches" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "Verzeichnisse rekursiv verarbeiten" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -3035,12 +3262,12 @@ msgstr "" "Füge Bücher zur Datenbank hinzu, auch wenn diese schon vorhanden sind. Der " "Abgleich erfolgt aufgrund des Titels der Bücher." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" "Sie müssen wenigstens eine Datei auswählen, die hinzugefügt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -3055,11 +3282,11 @@ msgstr "" "(Sie erhalten die ID Zahlen durch die Benutzung des Befehls list). Zum " "Beispiel: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "Sie müssen wenigstens ein Buch auswählen, das entfernt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -3073,15 +3300,15 @@ msgstr "" "gekennzeichneten logischen Buches hinzu. Sie erhalten die ID durch den list " "Befehl. Falls das Format schon vorhanden ist, wird es ersetzt.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "Sie müssen eine ID und eine eBook Datei angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "eBook Datei muss eine Endung haben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -3098,11 +3325,11 @@ msgstr "" "eine Dateiendung wie LRF oder TXT oder EPUB sein. Falls das logische Buch im " "entsprechenden Format nicht vorliegt, passiert gar nichts.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "Sie müssen eine ID und ein Format (Dateiendung) angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3118,15 +3345,15 @@ msgstr "" "die ID erkannte Buch. \n" "\"id\" ist eine ID Nummer des Befehls \"list\". \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "Drucke Meta-Daten als OPF (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "Sie müssen eine ID angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3148,11 +3375,11 @@ msgstr "" "einen Eindruck über das OPF Format, wenn Sie die --as-opf Option mit dem \n" "Befehl show_metadata verwenden.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "Geben Sie eine ID und eine Meta-Daten Datei an" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3170,29 +3397,29 @@ msgstr "" "Daten (in \n" "einer OPF Datei). Sie erhalten ID Nummern mit dem Befehl \"list\". \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" "Exportiere alle Bücher der Datenbank, die Liste der IDs wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "Exportiere Bücher in das angegebene Verzeichnis. Voreinstellung ist" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "Exportiere alle Bücher in ein einziges Verzeichnis" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" "Erstelle Dateinamen mit \"Autor - Titel\" anstelle von \"Titel - Autor\"" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "Sie müssen IDs oder die %s Option angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3213,11 +3440,11 @@ msgstr "" " \n" "Für Hilfe zu einem bestimmten Befehl (command): %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "Konnte Arbeitsprozess nicht starten." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "Konnte die fontconfig library nicht initialisieren" @@ -3309,7 +3536,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 msgid "Be more verbose while processing." -msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." +msgstr "Noch ausführlicher bei der weiteren Verarbeitung vorgehen." #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 msgid "" @@ -3351,7 +3578,7 @@ msgstr "Fortschrittsbalken nicht anzeigen" #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 msgid "Very verbose output, useful for debugging." -msgstr "Ausführliche Ausgabe, hilfreich zur Fehlerbeseitigung." +msgstr "Sehr ausführliche Ausgabe, hilfreich bei der Fehlersuche." #: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 msgid "" @@ -3361,9 +3588,8 @@ msgstr "" "Hilfreich zur Entwicklung von Rezepten. Erzwingt maximal 2 Artikel pro Feed " "und lädt höchstens 2 Feeds." -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "Rufe Feeds ab..." @@ -3392,41 +3618,41 @@ msgstr "Der Download von Teilen der folgenden Artikel schlug fehl:" msgid "\tFailed links:" msgstr "\tFehlgeschlagene Verknüpfungen:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" "Konnte Artikel nicht abrufen. Der erneute Start mit --debug zeigt mögliche " "Gründe an" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "Feeds der Index Seite erhalten" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "Versuche Umschlagbild zu laden..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "Starte Download von [%d Thread(s)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "Feeds wurden nach %s heruntergeladen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "Konnte Umschlagbild nicht laden: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "Lade Umschlagbild von %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "Artikel ohne Titel" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" @@ -3436,19 +3662,19 @@ msgstr "" "Artikel %s von %s geladen\n" "%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "Artikel geladen: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "Laden der Artikel fehlgeschlagen: %s von %s\n" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "Laden der Artikel schlug fehl: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "Rufe Feed ab" diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index f07545c35a..ae1a5d1092 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" -"PO-Revision-Date: 2008-07-13 07:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-07-29 07:48+0000\n" "Last-Translator: Marc van den Dikkenberg \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -47,6 +47,9 @@ msgstr "" #~ "Bijvoorbeeld: --serief-famile \"%s, Times new Roman\"\n" #~ " " +#~ msgid "mybook.epub" +#~ msgstr "mijnboek.epub" + #~ msgid "&Access Key;" #~ msgstr "&Toegangssleutel" @@ -89,24 +92,42 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif'; font-size:9pt;\">

                                                    " -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "%sGebruik%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Gemaakt door " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Schijf %s is niet gevonden. Probeer te herstarten." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "Er is geen geheugen kaart verbonden met de reader." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "%prog [opties] LITBESTAND" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "Output folder. Standaard is dit de huidige folder." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "Handig voor Debugging" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "OEB boek bemaakt in" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "De titel. Standaard: bestandsnaam" @@ -120,14 +141,17 @@ msgstr "" "worden. Standaard: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Onbekend" @@ -332,7 +356,6 @@ msgstr "" "De reguliere expressie die wordt gebruikt om hoofdstukken te herkennen. Deze " "wordt gezocht in 'heading tags' (h1-h6). Standaard: %default" -# (pofilter) escapes: escapes in original ('"h\d,class,chapter".') don't match escapes in translation ('"h\d\klasse,hoofdstuk".') #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:165 msgid "" "Detect a chapter beginning at an element having the specified attribute. The " @@ -343,8 +366,8 @@ msgstr "" "vind het begin van een hoofdstuk bij een element met het gespecificeerde " "attribuut. Het formaat voor deze optie is tagnaam regexp, attribuut naam, " "attribuut waarde regexp. Bijvoorbeeld, om alle kop tags te vinden met de " -"attribuut klasse \"hoofstuk\", gebruik \"h\\d,klasse,hoofdstuk\". Standaard is " -"%default" +"attribuut klasse=\"hoofstuk\", gebruik \"h\\d,klasse,hoofdstuk\". Standaard " +"is %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 msgid "" @@ -460,7 +483,7 @@ msgstr "" "gebruikte keuze is utf-8. Standaard zal er worden geprobeerd om de encoding " "automatisch te herkennen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -477,10 +500,92 @@ msgstr "" "bestanden, en zoekt ebook bestanden in deze archiven.\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "Geen bestand opgegeven om te converteren." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -493,7 +598,7 @@ msgstr "" " \n" "%prog converteert mijnbook.epubnaar mijnbook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -505,11 +610,15 @@ msgstr "" "\n" "%prog converteert mijnbook.fb2 naar mijnbook.lrf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "Print gegenereerde HTML naar stdout en beëindig." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "Bewaar gegenereerde HTML bestanden na conversie naar LRF." + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "Opties om het gedrag van feeds2disk te beïnvloeden." @@ -522,56 +631,56 @@ msgstr "Opties om het gedrag van html2lrf te beïnvloeden." msgid "Fetching of recipe failed: " msgstr "Ophalen van recept mislukt: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "\tBook Designer bestand herkend." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "\tLezen HTML" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen bestand herkend. Her-lezen..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "Schrijf pre-info HTML naar " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "Verwerking %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "\tConveteer naar BBEB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "Kan bestand niet parseren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "%s is een leeg bestand" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "Link %s %s kan niet worden geparseerd" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "Link %s kan niet worden toegevoegd aan de inhoudsopgave" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "Niet mogelijk om afbeelding %s te verwerken. Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "Niet mogelijk om interlaced PNG bestand %s te verwerken." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" @@ -579,14 +688,14 @@ msgstr "" "Niet mogelijk om afbeelding %s te verwerken\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Een fout is opgetreden tijdens het verwerken van een tabel: %s. Tabel opmaak " "zal worden genegeerd." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" @@ -594,11 +703,11 @@ msgstr "" "Foutieve tabel:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "Tabel heeft een cel die te groot is." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -606,19 +715,19 @@ msgstr "" "De website %s moet eerst als een HTML bestand worden weggeschreven, waarna " "je deze met html2rlf kunt converteren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "Omslag afbeelding kan niet worden ingelezen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "Kan niet lezen van: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "Verwerking van OPF bestand is niet gelukt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -636,7 +745,7 @@ msgstr "" "bestanden wijzen recursief. Het kan dus worden \n" "gebruikt om hele folders in een keer te converteren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -858,12 +967,11 @@ msgstr "Geef de auteur" msgid "Set the comment" msgstr "Geef de omschrijving" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" -msgstr "mijnboek.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "Gebruik:" @@ -937,11 +1045,11 @@ msgstr "" "Download een omslag afbeelding voor het boek geidentificeerd door ISBN via " "LibraryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "Gebruik: %s bestand.lit" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "omslag weggeschreven naar" @@ -953,22 +1061,14 @@ msgstr "Gebruik: pdf-meta bestand.pdf" msgid "No filename specified." msgstr "Geen bestandsnaam opgegeven" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "%prog [opties] mijnboek.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "Output folder. Standaard is dit de huidige folder." - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "RAW MOBI HTML bewaard in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "OEB boek bemaakt in" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -982,13 +1082,14 @@ msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "Opmerkingen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "Dialoogvenster" @@ -1003,6 +1104,51 @@ msgstr "TekstLabel" msgid "Choose Format" msgstr "Kies Formaat" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "&Profiel" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "Eenvoudig" @@ -1011,52 +1157,53 @@ msgstr "Eenvoudig" msgid "Advanced" msgstr "Geavanceerd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                                    Must be a directory." msgstr "
                                                    Moet een folder zijn." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "Foutieve database locatie " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "Foutieve database locatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                                    Cannot write to " msgstr "Foutieve database locatie.
                                                    Kan niet schrijven naar " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "Database aan het comprimeren. Dit kan even duren." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "Comprimeren..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuratie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "&Locatie van boek database )library1.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "Blader naar de nieuwe database locatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -1070,27 +1217,35 @@ msgstr "Blader naar de nieuwe database locatie" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "Gebruik &Romeinse nummers voor de series" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "&Aantal covers zichtbaar in blader modus (na herstart):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "Notificeer als een &nieuwe versie beschikbaar is" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "Opglagformaat voor &enkel bestand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "&Prioriteit van conversie batch" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "Standaard netwerk &timeout:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -1098,59 +1253,59 @@ msgstr "" "Geef de standaard timeout voor netwerk downloads. (bv. wanneer we informatie " "van het Internet moeten halen)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " seconden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "Werkbalk" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "Groot" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "Middel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "Klein" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "&Knop grootte in werkbalk" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "Laat &tekst zien in werkbalk knoppen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "Selecteer zichtbare &kolommen in bibliotheek weergave" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "Vaak gebruikte folders" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "Voeg een folder toe aan de lijst met vaak gebruikte folders" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "Verwijder een folder van de lijst met vaak gebruikte folders" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "Geef ongebruikte diskruimte uit de database terug" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "&Comprimeer database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "&Metadata van bestands naam" @@ -1289,7 +1444,6 @@ msgid "Convert %s to LRF" msgstr "Converteer %s naar LRF" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "Zet conversie standaarden" @@ -1308,7 +1462,6 @@ msgstr "Je hebt geen permissie om het bestand te lezen: " msgid "Error reading file" msgstr "Fout bij het lezen van bestand" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "

                                                    There was an error reading from file:
                                                    " @@ -1392,17 +1545,17 @@ msgid "Options" msgstr "Opties" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "Boek Omslag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "Verander &Omslag Afbeelding" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "Zoek een afbeelding om als omslag voor dit boek te gebruiken." @@ -1411,25 +1564,25 @@ msgid "Use cover from &source file" msgstr "Gebruik omslag van &bron bestand" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "&Titel: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "Verander de titel van dit boek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "&Auteur(s) " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1443,24 +1596,24 @@ msgstr "Auteur So&rteer" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "&Uitgeverij " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "Verander de uitgever van dit boek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "Ta&gs " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                                    They can be any words or phrases, separated by commas." @@ -1471,7 +1624,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "&Series:" @@ -1479,20 +1632,20 @@ msgstr "&Series:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "Lijst van bekende series. Je kunt nieuwe series toevoegen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "Series Index." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "Boek " @@ -1570,10 +1723,6 @@ msgstr "&Koptekst Formaat:" msgid "Override
                                                    CSS" msgstr "Negeer
                                                    CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "&Profiel" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Kantlijn:" @@ -1680,17 +1829,17 @@ msgid "Edit Meta information" msgstr "Verander Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "Auteur S&ortering: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1699,19 +1848,19 @@ msgstr "" "Bijvoorbeeld: Charles Dickens moet worden gesorteerd als: Dickens, Charles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "&Rangschikking" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "Rangschikking van dit boek. 0-5 sterren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr " sterren" @@ -1721,8 +1870,8 @@ msgstr "Voeg Ta&gs Toe: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "Open Tag Editor" @@ -1735,8 +1884,7 @@ msgid "Comma separated list of tags to remove from the books. " msgstr "" "Lijst van tags die moeten worden verwijderd, gescheiden met komma's. " -# (pofilter) xmltags: checks that XML/HTML tags have not been translated -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                                    Enter your username and password for LibraryThing.com.
                                                    If you " "do not have one, you can register " @@ -1744,64 +1892,68 @@ msgid "" msgstr "" "

                                                    Geef uw gebruikersnaam en wachtwoord voor LibraryThing.com. " "
                                                    Als u deze niet heeft, dan kunt u er gratis een krijgen door te registreren.

                                                    " +"href='http://www.librarything.com'>registreren

                                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                                    " msgstr "Omslag kon niet worden gedownload
                                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "Omslag kon niet worden gedownload" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "Kan omslag niet downloaden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "Het ISBN nummer voor dit boek moet worden opgegeven." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "Verander Meta Informatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" +msgstr "Wissel auteur en titel van plaats" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Remove unused series (Series that have no books)" msgstr "Verwijder ongebruikte series (Series die geen boeken bevatten)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "Download metadata van server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "Beschikbare Formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "Voeg een nieuw formaat voor dit boek toe aan de database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "Verwijder de geselecteerde formaten voor dit boek van de database." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "Download omslag afbeelding van de server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Verander de gebruikernaam en/of wachtwoord voor je account met " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "Wachtwoord wijzigen" @@ -2184,29 +2336,26 @@ msgstr "Geen overeenkomst" msgid "Authors:" msgstr "Auteurs:" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 msgid "Regular expression group name (?P)" -msgstr "Reguliere expressie groep naam (?P)" +msgstr "Reguliere expressie groep naam (?)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108 msgid "Series:" msgstr "Serie:" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109 msgid "Regular expression group name (?P)" -msgstr "Reguliere expressie groep naam (?P)" +msgstr "Reguliere expressie groep naam (?)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 msgid "Series index:" msgstr "Serie Index" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 msgid "Regular expression group name (?P)" -msgstr "Reguliere expressie groep naam (?P)" +msgstr "Reguliere expressie groep naam (?)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 msgid "ISBN:" @@ -2381,11 +2530,11 @@ msgstr "Open eboek" msgid "Configure" msgstr "Configureer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                                    For help visit %s.kovidgoyal.net
                                                    " @@ -2393,43 +2542,43 @@ msgstr "" "

                                                    Voor assistentie, bezoek %s.kovidgoyal.net
                                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                                    %%(device)s

                                                    " msgstr "" "%s: %s door Kovid Goyal %%(version)s
                                                    %%(device)s

                                                    " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "Stuur naar hoofdgeheugen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "Stuur naar opslag kaart" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "en verwijder uit bibliotheek" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "Bewaar standaard op geheugen kaart" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "Bewerk metadata individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "Bewerk metadata in groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "Voeg boeken toe uit een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2437,7 +2586,7 @@ msgstr "" "Voeg recursief boeken toe (Een boek per folder, neemt aan dat ieder eboek " "bestand hetzelfde boek is in een ander formaat)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2445,53 +2594,61 @@ msgstr "" "voeg recursief boeken toe (Meerdere boeken per folder, neemt aan dat ieder " "eboek bestand een ander boek is)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Opslaan op schijf" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "Opslaan op schijf in een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "Bewaar alleen %s formaat op schijf" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Bekijk" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "Bekijk specifiek formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "Converteer Individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "Converteer Groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr " gedetecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "Apparaat: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "Verbonden " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "Apparaat Database Beschadigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                                    The database of books on the reader is corrupted. Try the " @@ -2520,8 +2677,8 @@ msgstr "" " \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                                    Books with the same title as the following already exist in the database. " "Add them anyway?

                                                      " @@ -2529,53 +2686,60 @@ msgstr "" "

                                                      Boeken met de volgende titels bestaan al in de database. Wil je ze echt " "toevoegen?

                                                        " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "Duplicaten gevonden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "Boeken worden geupload naar de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "Geen schijfruimte op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                        Cannot upload books to device there is no more free space available " msgstr "" "

                                                        De boeken kunnen niet worden geupload naar de lezer, omdat er onvoldoende " "schijfruimte beschikbaar is " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "Boeken worden verwijderd van de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "Metedata kan niet worden gewijzigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "Geen boeken geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "Boeken worden naar de lezer verzonden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "Geen geschikte formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                          %s
                                                        " @@ -2583,11 +2747,11 @@ msgstr "" "De volgende boeken konden niet naar de lezer worden deupload, omdat geen " "geschikt formaat werd gevonden:
                                                          %s
                                                        " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "Kan niet naar schijf worden opgeslagen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                        Could not save the following books to disk, because the %s format is not " "available for them:

                                                          " @@ -2595,68 +2759,93 @@ msgstr "" "

                                                          De volgende boeken konden niet worden bewaard op schijf, omdat het %s " "formaat niet beschikbaar is:

                                                            " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "Sommige boeken konden niet worden opgeslagen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "Download nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "Downloading nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "Nieuws gedownload, uploading naar lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "Kan niet converteren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "Begin groep convertering van %d boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                            Could not convert %d of %d books, because no suitable source format was " +"found.

                                                              %s
                                                            " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "Geen boek geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "Kan niet bekijken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "Kies het te bekijken formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "%s heeft geen beschikbare formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "Kan niet configureren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "Can niet configueren terwijl bestaande opdrachten bezig zijn" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "copieer database naar " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "ongeldige database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                            An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                            Error: %s" @@ -2664,23 +2853,23 @@ msgstr "" "

                                                            Een ongeldige database bestaat op %s, verwijder deze voordat je probeert " "de bestaande database te verplaatsen.
                                                            Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "Database kon niet worden verplaatst" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "Geen details beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "Geen details zijn beschikbaar voor de boeken op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2688,15 +2877,15 @@ msgstr "" "Er is een tijdelijke fout opgetreden tijdens de communicatie met de lezer. " "verwijzer de lezer en plug hem opnieuw in, of herstart." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "Converteer Fout" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "database bestaat niet" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2704,7 +2893,7 @@ msgstr "" "De folder waarin de database zou moetten zijn: %s bestaat niet meer. Kies " "een nieuwe database locatie." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" @@ -2712,7 +2901,7 @@ msgstr "" "Laatste versie: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " @@ -2722,7 +2911,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nieuwe functies " "Bezoek download pagina?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "Update beschikbaar" @@ -2831,37 +3020,36 @@ msgstr "FOUT: Niet-verwerkte uitzondering" msgid "Add a custom news source" msgstr "Voeg een persoonlijke nieuwsbron toe" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 msgid "" "

                                                            Please enter your username and password for %s
                                                            If you do not have one, " "please subscribe to get access to the articles.
                                                            Click OK to proceed." msgstr "" "

                                                            Voer uw gebruikersnaam en wachtwoord voor %s in.
                                                            Als u er geen geeft, " -"registreer dan om toegang tot de artikelen te krijgen.
                                                            Klik op OK om " +"registreer dan om toegang tot de artikelen te krijgen.
                                                            Klik op OK om " "verder te gaan." #: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 msgid "Custom news sources" msgstr "Persoonlijke nieuws bronnen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "Opdrachten" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "Klik om een lijst met actieve opdrachten te zien" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "Klik om boeken bij hun omslag te bekijken" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "Klik om zoeken op omslag uit te schakelen" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                            Browsing books by their covers is disabled.
                                                            Import of pictureflow " "module failed:
                                                            " @@ -2972,7 +3160,7 @@ msgstr "Ongeldig veld. Beschikbare velden:" msgid "Invalid sort field. Available fields:" msgstr "Ongeldig sorteer veld. Beschikbare velden:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2980,7 +3168,7 @@ msgstr "" "De volgende boeken zijn niet toegevoegd omdat ze al bestaan in de database. " "(Zie de --duplicates optie):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2993,7 +3181,7 @@ msgstr "" "Voeg de gespecificeerde bestanden als boeken toe aan de database. Je kunt " "ook folders opgeven, zie de folder-gerelateerde opties hieronder. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -3002,11 +3190,11 @@ msgstr "" "bestanden in de folder verschillende bestandsformaten zin voor dat enkele " "boek." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "Bewerk folders recursief" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -3014,11 +3202,11 @@ msgstr "" "Voeg boeken toe aan de database zelfs als deze al bestaan. Vergelijking is " "gebaseerd op de boek titels." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "Ten minste een boek moet worden opgegeven om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -3032,11 +3220,11 @@ msgstr "" "moeten een lijst zijn die is gescheiden door komma's. (Je kan de id nummers " "zien door het list commando te gebruiken). Bijvoorbeeld, 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "Ten minste een boek moet worden opgegeven om te verwijderen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -3051,15 +3239,15 @@ msgstr "" "door het list commando te gebruiken. Als het formaat al bestaat, dan zal het " "worden vervangen.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "zowel een id als een eboek bestand moeten worden gespecificeerd" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "eboek bestand heeft een extensie nodig" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -3076,11 +3264,11 @@ msgstr "" "bestands extensie zoals LRF, TXT of EPUB. Als het logische boek niet in dit " "formaat bestaat, dan zal er niets gebeuren.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "Een id en een formaat moeten worden opgegeven" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -3096,15 +3284,15 @@ msgstr "" "met het id. \n" "id is een id nummer van het list commando \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "Print metadata in OPF formaat (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "Je moet een id opgeven" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -3126,11 +3314,11 @@ msgstr "" "het list commando. Je kunt meer informatie voor het OPF formaat zien door\n" "--as-opf parameter op te geven bij het show_metadata commando.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "Je moet een id en metadata bestand opgeven" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -3147,27 +3335,27 @@ msgstr "" "het boek, de cover en metadata (in een opf bestand) Je kunt id nummers zien\n" "via het list commando. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "Exporteer alle boeken in de database, negeer de lijst met ids." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "Exporteer boeken naar de opgegeven folder. Standaard is" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "exporteer alle boeken naar een enkele folder" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "Maak bestands namen als auteur - titel in plaats van titel - auteur" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "Je moet ids opgeven of de %s optie gebruiken" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -3187,11 +3375,11 @@ msgstr "" " \n" "For help on an individual command: %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "Werker sessie kan niet worden gestart." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "De fontconfig bibliotheek kon niet worden geinitialiseerd." @@ -3333,9 +3521,8 @@ msgstr "" "Handig voor recept ontwikkeling. Forceer max_articles_per_feed als 2 en " "download niet meer dan 2 feeds." -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "Downloading feeds..." @@ -3364,40 +3551,40 @@ msgstr "Delen van de volgende artikelen konden niet worden gedownload:" msgid "\tFailed links:" msgstr "\tMislukte links:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" "Artikel kon niet worden gedownload. Draai met --debug om de reden te zien" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "feeds van index pagina" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "Probeer omslag te downloaden" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "Begin download [%d thread(s)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "Feeds gedownload tot %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "Kon omslag niet downloaden: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "Download omslag van %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "Artikel zonder Naam" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" @@ -3407,19 +3594,19 @@ msgstr "" "Artikel %s van %s gedownload\n" "%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "Artikel gedownload: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "Artikel %s van %s kon niet worden gedownload\n" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "Artikel download mislukt: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "Downloading feed" @@ -3454,7 +3641,6 @@ msgstr "" "Maximum aantal level om recursief te zoeken -- de diepte om links te volgen. " "Standaard %default" -# (pofilter) xmltags: checks that XML/HTML tags have not been translated #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:394 msgid "" "The maximum number of files to download. This only applies to files from \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-07-05 03:33+0000\n" "Last-Translator: Tiago Silva \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Criado por " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "" @@ -46,14 +64,17 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "" @@ -315,7 +336,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -326,10 +347,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -338,7 +441,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -346,11 +449,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -363,95 +470,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -462,7 +569,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -644,12 +751,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -706,11 +812,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -722,22 +828,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -751,13 +849,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -772,6 +871,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -780,52 +924,53 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                                            Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                                            Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -839,85 +984,93 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1049,7 +1202,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "" @@ -1140,17 +1292,17 @@ msgid "Options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" @@ -1159,25 +1311,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1189,24 +1341,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                                            They can be any words or phrases, separated by commas." @@ -1214,7 +1366,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "" @@ -1222,20 +1374,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "" @@ -1313,10 +1465,6 @@ msgstr "" msgid "Override
                                                            CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -1411,36 +1559,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr "" @@ -1450,8 +1598,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1463,67 +1611,71 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                                            Enter your username and password for LibraryThing.com.
                                                            If you " "do not have one, you can
                                                            register " "for free!.

                                                            " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                                            " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 -msgid "IS&BN:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "" @@ -2068,110 +2220,118 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                                            For help visit %s.kovidgoyal.net
                                                            " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                                            %%(device)s

                                                            " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                                            The database of books on the reader is corrupted. Try the " @@ -2187,190 +2347,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                                            Books with the same title as the following already exist in the database. " "Add them anyway?

                                                              " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                              Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                                %s
                                                              " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                              Could not save the following books to disk, because the %s format is not " "available for them:

                                                                " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                                Could not convert %d of %d books, because no suitable source format was " +"found.

                                                                  %s
                                                                " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                                An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                                Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2483,23 +2675,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                                Browsing books by their covers is disabled.
                                                                Import of pictureflow " "module failed:
                                                                " @@ -2588,13 +2780,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2603,27 +2795,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2632,11 +2824,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2645,15 +2837,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2663,11 +2855,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2677,15 +2869,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2698,11 +2890,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2713,27 +2905,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2745,11 +2937,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2858,9 +3050,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2889,58 +3080,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index b0277eed95..c3a0b1937e 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -6,36 +6,54 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.55\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-21 22:18+0000\n" -"PO-Revision-Date: 2008-07-22 05:27+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" +"PO-Revision-Date: 2008-07-22 05:50+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-22 05:44+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:138 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 #, fuzzy msgid "%sUsage%s: %s\n" msgstr "%sИспользовано%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:175 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "Сделано " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Не удалось определить диск %s. Попробуйте перезагрузиться." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "К ридеру не подключена карта памяти." +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "Укажите заголовок. По умолчанию: имя файла." @@ -50,14 +68,17 @@ msgstr "" "умолчанию: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:879 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1387 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1517 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "Неизвестно" @@ -414,6 +435,88 @@ msgstr "" msgid "No file to convert specified." msgstr "Не указан файл для преобразования." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -515,40 +618,40 @@ msgid "" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1749 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1751 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1773 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1803 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1846 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1990 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -559,7 +662,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -741,11 +844,10 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -803,11 +905,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -819,22 +921,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:393 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:412 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:414 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -855,6 +949,7 @@ msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -869,6 +964,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -877,47 +1017,47 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                                                Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                                                Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 @@ -937,89 +1077,93 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 msgid "&Number of covers to show in browse mode (after restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1151,7 +1295,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 msgid "Set conversion defaults" msgstr "" @@ -1415,10 +1558,6 @@ msgstr "" msgid "Override
                                                                CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -2261,23 +2400,31 @@ msgstr "" msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                                                The database of books on the reader is corrupted. Try the " @@ -2293,190 +2440,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:473 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                                                Books with the same title as the following already exist in the database. " "Add them anyway?

                                                                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:435 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                                  Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                                    %s
                                                                  " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                                  Could not save the following books to disk, because the %s format is not " "available for them:

                                                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:709 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:744 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                                    Could not convert %d of %d books, because no suitable source format was " +"found.

                                                                      %s
                                                                    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:937 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:999 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1014 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1015 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                                    An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                                    Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1023 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1044 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1045 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1209 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2589,23 +2768,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                                    Browsing books by their covers is disabled.
                                                                    Import of pictureflow " "module failed:
                                                                    " @@ -2851,11 +3030,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:344 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:157 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2964,9 +3143,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2995,58 +3173,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 354abec96c..f82a5d0f7b 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -6,35 +6,53 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.17\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-05-24 06:19+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "" @@ -46,14 +64,17 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "" @@ -315,7 +336,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -326,10 +347,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -338,7 +441,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -346,11 +449,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -363,95 +470,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -462,7 +569,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -644,12 +751,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "" @@ -706,11 +812,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -722,22 +828,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -751,13 +849,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -772,6 +871,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "" @@ -780,52 +924,53 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                                                    Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                                                    Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -839,85 +984,93 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1049,7 +1202,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "" @@ -1140,17 +1292,17 @@ msgid "Options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" @@ -1159,25 +1311,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1189,24 +1341,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                                                    They can be any words or phrases, separated by commas." @@ -1214,7 +1366,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "" @@ -1222,20 +1374,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "" @@ -1313,10 +1465,6 @@ msgstr "" msgid "Override
                                                                    CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -1411,36 +1559,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr "" @@ -1450,8 +1598,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1463,67 +1611,71 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                                                    Enter your username and password for LibraryThing.com.
                                                                    If you " "do not have one, you can register " "for free!.

                                                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 -msgid "IS&BN:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "" @@ -2068,110 +2220,118 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                                                    For help visit %s.kovidgoyal.net
                                                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                                                    %%(device)s

                                                                    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                                                    The database of books on the reader is corrupted. Try the " @@ -2187,190 +2347,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                                                    Books with the same title as the following already exist in the database. " "Add them anyway?

                                                                      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                                      Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                                        %s
                                                                      " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                                      Could not save the following books to disk, because the %s format is not " "available for them:

                                                                        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                                        Could not convert %d of %d books, because no suitable source format was " +"found.

                                                                          %s
                                                                        " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                                        An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                                        Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2483,23 +2675,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                                        Browsing books by their covers is disabled.
                                                                        Import of pictureflow " "module failed:
                                                                        " @@ -2588,13 +2780,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2603,27 +2795,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2632,11 +2824,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2645,15 +2837,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2663,11 +2855,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2677,15 +2869,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2698,11 +2890,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2713,27 +2905,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2745,11 +2937,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2858,9 +3050,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2889,58 +3080,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/translations/te.po b/src/calibre/translations/te.po index 6ff7d916ec..971ff80cf0 100644 --- a/src/calibre/translations/te.po +++ b/src/calibre/translations/te.po @@ -7,34 +7,52 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2008-07-09 04:18+0000\n" +"POT-Creation-Date: 2008-08-03 09:01+0000\n" "PO-Revision-Date: 2008-06-24 13:22+0000\n" "Last-Translator: వీవెన్ (Veeven) \n" "Language-Team: Telugu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-07-19 02:36+0000\n" +"X-Launchpad-Export-Date: 2008-08-04 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:178 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/__init__.py:215 msgid "Created by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:175 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:356 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:780 +msgid "%prog [options] LITFILE" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:783 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:404 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:786 +msgid "Useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:797 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:425 +msgid "OEB ebook created in" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:71 msgid "Set the title. Default: filename." msgstr "" @@ -46,14 +64,17 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 -#: /home/kovid/work/calibre/src/calibre/library/database.py:925 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1433 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:926 +#: /home/kovid/work/calibre/src/calibre/library/database.py:904 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1412 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1542 msgid "Unknown" msgstr "" @@ -315,7 +336,7 @@ msgid "" "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:146 msgid "" "any2lrf [options] myfile\n" "\n" @@ -326,10 +347,92 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:161 msgid "No file to convert specified." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:200 +msgid "Rendered %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:230 +msgid "" +"Options to control the conversion of comics (CBR, CBZ) files into ebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:236 +msgid "Title for generated ebook. Default is to use the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:238 +msgid "" +"Set the author in the metadata of the generated ebook. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:241 +msgid "" +"Path to output LRF file. By default a file is created in the current " +"directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:243 +msgid "Number of colors for Grayscale image conversion. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:245 +msgid "" +"Disable normalize (improve contrast) color range for pictures. Default: False" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:247 +msgid "Maintain picture aspect ratio. Default is to fill the screen." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:249 +msgid "Disable sharpening." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:251 +msgid "Don't split landscape images into two portrait images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:253 +msgid "" +"Don't sort the files found in the comic alphabetically by name. Instead use " +"the order they were added to the comic." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:255 +msgid "" +"Choose a profile for the device you are generating this LRF for. The default " +"is the SONY PRS-500 with a screen size of 584x754 pixels. Choices are %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:257 +msgid "" +"Be verbose, useful for debugging. Can be specified multiple times for " +"greater verbosity." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:259 +msgid "Don't show progress bar." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:264 +msgid "" +"%prog [options] comic.cb[z|r]\n" +"\n" +"Convert a comic in a CBZ or CBR file to an LRF ebook. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:328 +msgid "Rendering comic pages..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +msgid "Output written to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 msgid "" "Usage: %prog [options] mybook.epub\n" @@ -338,7 +441,7 @@ msgid "" "%prog converts mybook.epub to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:17 msgid "" "%prog [options] mybook.fb2\n" "\n" @@ -346,11 +449,15 @@ msgid "" "%prog converts mybook.fb2 to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 msgid "Print generated HTML to stdout and quit." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +msgid "Keep generated HTML files after completing conversion to LRF." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" msgstr "" @@ -363,95 +470,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:340 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:356 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:374 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:388 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:530 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:555 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:556 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:599 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:600 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:944 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:949 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:987 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:997 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1752 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1746 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1754 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1768 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1798 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1806 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1849 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1844 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1852 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1978 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1987 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1993 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -462,7 +569,7 @@ msgid "" "convert a whole tree of HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:22 msgid "" "Usage: %prog [options] mybook.lit\n" "\n" @@ -644,12 +751,11 @@ msgstr "" msgid "Set the comment" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -msgid "mybook.epub" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:117 +msgid "A comma separated list of tags to set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 msgid "Usage:" msgstr "వాడుక:" @@ -706,11 +812,11 @@ msgid "" "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:40 msgid "Usage: %s file.lit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:50 msgid "Cover saved to" msgstr "" @@ -722,22 +828,14 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:344 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:402 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:346 -msgid "Output directory. Defaults to current directory." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:423 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:367 -msgid "OEB ebook created in" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 @@ -751,13 +849,14 @@ msgstr "శీర్షిక" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:246 msgid "Comments" msgstr "వ్యాఖ్యలు" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:79 msgid "Dialog" msgstr "" @@ -772,6 +871,51 @@ msgstr "" msgid "Choose Format" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:38 +msgid "Set defaults for conversion of comics (CBR/CBZ files)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:53 +msgid "Set options for converting %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:80 +msgid "&Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:81 +msgid "&Author(s):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:82 +msgid "&Number of Colors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:84 +msgid "Disable &normalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:85 +msgid "Keep &aspect ratio" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:86 +msgid "Disable &Sharpening" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:87 +msgid "&Landscape" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +msgid "Dont so&rt" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 msgid "Basic" msgstr "ప్రాధమిక" @@ -780,52 +924,53 @@ msgstr "ప్రాధమిక" msgid "Advanced" msgstr "ఉన్నత" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "
                                                                        Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:110 msgid "Invalid database location.
                                                                        Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:122 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "స్వరూపణం" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Location of books database (library1.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:243 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 @@ -839,85 +984,93 @@ msgstr "" msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +msgid "&Number of covers to show in browse mode (after restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226 +msgid "Ask for &confirmation before deleting files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:228 msgid "&Priority for conversion jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 msgid " seconds" msgstr " క్షణాలు" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:232 msgid "Toolbar" msgstr "పనిముట్ల పట్టీ" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:233 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:234 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:235 msgid "Small" msgstr "చిన్న" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:236 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:237 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:238 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:239 msgid "Frequently used directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:240 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:242 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:244 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:245 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:246 msgid "&Metadata from file name" msgstr "" @@ -1049,7 +1202,6 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Set conversion defaults" msgstr "" @@ -1140,17 +1292,17 @@ msgid "Options" msgstr "ఎంపికలు" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 msgid "Book Cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 msgid "Browse for an image to use as the cover of this book." msgstr "" @@ -1159,25 +1311,25 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1189,24 +1341,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "Change the publisher of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

                                                                        They can be any words or phrases, separated by commas." @@ -1214,7 +1366,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "&Series:" msgstr "" @@ -1222,20 +1374,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 msgid "Series index." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Book " msgstr "పుస్తకం " @@ -1313,10 +1465,6 @@ msgstr "" msgid "Override
                                                                        CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -msgid "&Profile:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" @@ -1411,36 +1559,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid " stars" msgstr "" @@ -1450,8 +1598,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Open Tag Editor" msgstr "" @@ -1463,67 +1611,71 @@ msgstr "" msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "" "

                                                                        Enter your username and password for LibraryThing.com.
                                                                        If you " "do not have one, you can register " "for free!.

                                                                        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover.
                                                                        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 -msgid "IS&BN:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 msgid "Change password" msgstr "సంకేతపదం మార్చు" @@ -2068,110 +2220,118 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "" "

                                                                        For help visit %s.kovidgoyal.net
                                                                        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "%s: %s by Kovid Goyal %%(version)s
                                                                        %%(device)s

                                                                        " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +msgid "Set defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Set defaults for conversion of comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:311 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:348 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:349 msgid "" "\n" "

                                                                        The database of books on the reader is corrupted. Try the " @@ -2187,190 +2347,222 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:475 msgid "" "

                                                                        Books with the same title as the following already exist in the database. " "Add them anyway?

                                                                          " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:478 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:450 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid "" "

                                                                          Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:541 +msgid "Confirm delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:542 +msgid "Are you sure you want to delete these %d books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:685 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:686 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:

                                                                            %s
                                                                          " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:692 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:702 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:713 msgid "" "

                                                                          Could not save the following books to disk, because the %s format is not " "available for them:

                                                                            " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:717 msgid "Could not save some ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:750 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:752 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:794 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 +msgid "Convert book %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 +msgid "" +"

                                                                            Could not convert %d of %d books, because no suitable source format was " +"found.

                                                                              %s
                                                                            " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:878 +msgid "Convert comic %d of %d (%s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Convert book: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:953 +msgid "Convert comic: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:909 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1038 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1072 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1110 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 msgid "" "

                                                                            An invalid database already exists at %s, delete it before trying to move " "the existing database.
                                                                            Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1119 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1140 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1141 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1183 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1235 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1254 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1305 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "" "%s has been updated to version %s. See the new features. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1311 msgid "Update available" msgstr "" @@ -2483,23 +2675,23 @@ msgstr "" msgid "Custom news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:108 msgid "Click to see list of active jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to browse books by their covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 msgid "Click to turn off Cover Browsing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:142 msgid "" "

                                                                            Browsing books by their covers is disabled.
                                                                            Import of pictureflow " "module failed:
                                                                            " @@ -2588,13 +2780,13 @@ msgstr "" msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:198 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2603,27 +2795,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:207 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:209 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:211 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 msgid "" "%prog remove ids\n" "\n" @@ -2632,11 +2824,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:266 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2645,15 +2837,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:277 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2663,11 +2855,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:303 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:321 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -2677,15 +2869,15 @@ msgid "" "id is an id number from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:348 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -2698,11 +2890,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:361 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:373 msgid "" "%prog export [options] ids \n" "\n" @@ -2713,27 +2905,27 @@ msgid "" "an opf file). You can get id numbers from the list command. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:381 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:385 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:387 msgid "Create file names as author - title instead of title - author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:402 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2745,11 +2937,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:321 +#: /home/kovid/work/calibre/src/calibre/parallel.py:347 msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:169 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2858,9 +3050,8 @@ msgid "" "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:577 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:70 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 msgid "Fetching feeds..." msgstr "" @@ -2889,58 +3080,58 @@ msgstr "" msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:559 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:562 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:581 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:585 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:637 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:640 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:650 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:653 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:660 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:663 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:665 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:668 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:745 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:748 msgid "" "\n" "Downloaded article %s from %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:754 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:757 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 msgid "Failed to download article: %s from %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:765 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:777 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:780 msgid "Fetching feed" msgstr "" diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index eea9c9749e..c7791bb4a0 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -202,6 +202,15 @@ class Config(object): raise IOError('Could not lock config file: %s'%self.config_file_path) return self.option_set.parse_string(src) + def as_string(self): + if not os.path.exists(self.config_file_path): + return '' + try: + with ExclusiveFile(self.config_file_path) as f: + return f.read() + except LockError: + raise IOError('Could not lock config file: %s'%self.config_file_path) + def set(self, name, val): if not self.option_set.has_option(name): raise ValueError('The option %s is not defined.'%name) From cd5e2bb8496b9096349f9b27b61214b74c1b7950 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 10:08:13 -0700 Subject: [PATCH 03/31] IGN:Tag release From e236efdad508214b7502b218ea223103bf7284b9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 12:59:12 -0700 Subject: [PATCH 04/31] IGN:... --- installer/linux/freeze.py | 2 +- installer/windows/calibre/calibre.mpi | 139 +++++++++++++- setup.py | 226 +++++++++++++---------- src/calibre/debug.py | 17 +- src/calibre/devices/prs500/cli/main.py | 2 +- src/calibre/linux.py | 80 ++++---- src/calibre/manual/faq.rst | 2 +- src/calibre/manual/resources/logo.png | Bin 31560 -> 9261 bytes src/calibre/parallel.py | 246 +++++++++++++------------ upload.py | 43 ++--- 10 files changed, 466 insertions(+), 291 deletions(-) diff --git a/installer/linux/freeze.py b/installer/linux/freeze.py index 0203e7d0ae..f33b059903 100644 --- a/installer/linux/freeze.py +++ b/installer/linux/freeze.py @@ -21,7 +21,7 @@ DBUS = '/usr/lib/libdbus-1.so.3' LIBMNG = '/usr/lib/libmng.so.1' LIBZ = '/lib/libz.so.1' LIBBZ2 = '/lib/libbz2.so.1' -LIBUSB = '/lib/libusb.so' +LIBUSB = '/usr/lib/libusb.so' LIBPOPPLER = '/usr/lib/libpoppler.so.3' diff --git a/installer/windows/calibre/calibre.mpi b/installer/windows/calibre/calibre.mpi index 3dc587e603..35de36caab 100644 --- a/installer/windows/calibre/calibre.mpi +++ b/installer/windows/calibre/calibre.mpi @@ -213,7 +213,6 @@ File ::D9A3AF75-5939-CB51-9F33-5A048911103E -type dir -name etc -parent 6CCF3F71 File ::A628E495-239B-DAF4-D858-BCE36CB41E6E -type dir -name imageformats -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::0A533DB2-D494-A9ED-1334-DECC357BD426 -type dir -name codecs -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::0F47A44E-E347-1CD4-E89F-37B447C4A270 -type dir -name driver -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 -File ::19A416A8-8DDD-658B-A3D4-F89ABD02CFBB -type dir -name ImageMagick -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::A146565C-D163-7F68-7C70-A6A336B32526 -type dir -name iconengines -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::3245B06C-1C22-1A8A-5710-6D36651AAA70 -name etree.pyd -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::B49A5610-13F6-FB5D-0673-DB47C6BB385D -name rtf-meta.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 @@ -355,6 +354,144 @@ File ::293E6ABE-17C9-5E53-1B44-C27029C8C061 -name winutil.pyd -parent 36E8EEAC-F File ::A5737158-18DF-7F20-2BDF-2DF615663891 -name lzx.pyd -parent 36E8EEAC-F54D-5DE9-02D8-ECDFEBB4B5E2 File ::CA9E098C-2931-9781-1303-213C242F9A5E -name lit2oeb.exe -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::16B5A447-066C-C93E-F63D-8BC0D57CA544 -name lit2oeb.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::ABF342D2-82A9-2A20-BA97-54AD5BAF1A2A -name IM_MOD_RL_sfw_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::3877E295-C7EB-DF63-DA91-B9E2F9D8035A -name comic2lrf.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F47345A3-6CE0-4F5B-9CAE-3F4A18D4AA5A -name IM_MOD_RL_rle_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::3A211C93-1B8B-A8AA-E240-A3287974DAB4 -name IM_MOD_RL_tiff_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F24F3123-05A3-B452-D12B-CE6C126501B1 -name CORE_RL_libxml_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D7034E85-2733-DB61-DB49-C34B767B4B45 -name IM_MOD_RL_sun_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::21C1F4D3-487E-5FFF-C8CE-8E5FE779A786 -name IM_MOD_RL_msl_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::01EC7979-C9CB-696C-E8B3-F5945E1115BB -name IM_MOD_RL_jp2_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::0F86B693-D83A-DB03-8641-219FE766D980 -name CORE_RL_ttf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::DDCAEB76-7AC4-CA1A-0742-34B556592D2A -name IM_MOD_RL_exr_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::4D274537-6B6D-63F2-2615-E0CD279880A3 -name CORE_RL_Magick++_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A87CE00E-9F87-DBE3-DDA5-FC68D6D0731E -name IM_MOD_RL_dib_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9114D530-B73B-CC7C-F6A6-655B7271AB35 -name IM_MOD_RL_preview_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::31EE0880-F1C8-94D6-4EDC-B09A576E0908 -name CORE_RL_magick_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BEA2B769-1A54-4398-E8B4-5BE15637B705 -name IM_MOD_RL_svg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::7E300AD4-7C03-5835-0DD6-E9FA8737585A -name IM_MOD_RL_mpeg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5E9901D8-BBB7-A17C-5A04-837C0ADF8CAE -name IM_MOD_RL_clipboard_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F13497D2-87C0-243D-916A-0A160F1A1896 -name IM_MOD_RL_png_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::DBD1CF95-1B01-9F5C-66D9-C7B4E1B44CC7 -name CORE_RL_bzlib_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::149C038D-9CD6-20C5-49C3-FC6948D0709D -name IM_MOD_RL_wmf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F77F5E54-1D54-F7D3-9520-BB1811C11AA6 -name IM_MOD_RL_txt_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::3545B38D-1BDF-B355-F779-4D83F292E2B6 -name IM_MOD_RL_viff_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::6E33F2FD-17BB-F096-4551-0E3B22924A4D -name IM_MOD_RL_ps2_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F4C810FF-4291-4491-0FA2-CFAD0BA690A9 -name type.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::02A3CD7D-743C-FAA8-9C20-3E8E59B8C2C2 -name IM_MOD_RL_ps3_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::697020D6-C5DA-A7DC-9454-1F9523D7748D -name IM_MOD_RL_dot_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::E9D0609E-2D12-A8C0-9B47-D09CACB4A3AF -name IM_MOD_RL_xwd_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F237A6C8-4037-B9E5-8D65-29A5A69CADFE -name IM_MOD_RL_fits_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BDB45C50-E57A-357D-1D5A-392036227E6B -name IM_MOD_RL_histogram_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5A6DBEB5-CD8A-4109-A04C-EF0436BC1CDC -name mfc71.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::FCC2A44D-D2F9-74DC-0C27-86F094E2C3E9 -name IM_MOD_RL_pnm_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::8E71473E-34AE-B7A3-B506-8A6AA622DAD7 -name IM_MOD_RL_ipl_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B680E84A-BA1C-5EA2-902E-095DD22A48F2 -name msvcp71.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::6AF09D1D-8889-8A87-9FD4-1471DBB1354C -name IM_MOD_RL_rgb_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::941B86E2-428A-3F4A-EB34-CBDBDDAD648C -name IM_MOD_RL_xbm_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::1613269D-8A63-C843-E862-9B80CC17E60F -name IM_MOD_RL_otb_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::334E3925-703D-DDCA-A079-C53DB06AA069 -name IM_MOD_RL_avi_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::23549B03-F856-3B90-C9C5-3B64A5910C7B -name CORE_RL_lcms_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::0E3F5727-D99A-44CD-35E0-4FDFBB95FCBC -name IM_MOD_RL_xpm_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::955B5799-4DB3-F422-589A-CDC20A82B6CB -name IM_MOD_RL_xcf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D3AB494C-3218-0137-4399-3FB1662C05D3 -name IM_MOD_RL_emf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::1DEF5AF0-2376-539B-2A61-35B6ADC2F4BA -name log.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D472B449-3644-C538-30EF-EC42E3B84C43 -name IM_MOD_RL_mtv_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::8B4E61F1-8FC2-7E65-4B94-3F19100DF58B -name CORE_RL_tiff_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B747FE2A-0054-6815-40D0-74F89FC8C757 -name IM_MOD_RL_dps_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::8B1660CC-7A97-96A2-1280-34554028CB9F -name IM_MOD_RL_dcm_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::21B7EBEC-30C8-F2E8-9D73-E4E6965EA856 -name locale.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::85087BFC-42D6-C583-586E-19CAD45E6A61 -name CORE_RL_wand_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BE24EB64-E7BB-0E63-256E-DEDC2BBF1C2B -name IM_MOD_RL_ttf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::7693E752-1A81-F6F3-C55D-9E8D94D6E4DC -name IM_MOD_RL_dpx_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A1451D28-A06B-3F03-4DCA-884729C5A030 -name IM_MOD_RL_jpeg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::3F0D8F7A-906F-8CAE-84D7-E3480A09D39D -name IM_MOD_RL_fax_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::CA8F1852-F5C1-86E8-31B9-8B1EFE837ADB -name IM_MOD_RL_avs_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::72370AAC-67CF-F570-2AA2-658E4C81C859 -name IM_MOD_RL_mvg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A8265A1E-E9B5-A38F-9ACF-99669CAE1E9F -name IM_MOD_RL_tga_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A8A9A383-0364-515F-C1D8-F82C274D652B -name configure.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A2167661-AF2B-E15E-60DA-715F47E5AA30 -name IM_MOD_RL_uil_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::7608E2FF-1BF6-E18A-A884-244794BDA01B -name IM_MOD_RL_cut_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::772CA344-5EFD-78A0-3542-777F12356C8D -name Xext.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::37F8D85E-4EE9-80E5-A4A2-8F30444AD5CC -name IM_MOD_RL_scr_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::973011B9-D193-6D64-D4EB-D82B0C730379 -name IM_MOD_RL_map_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9B9F088C-A20A-0C19-EF7D-52908A020D36 -name thresholds.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::831AAF1C-7CBE-CAD3-79A8-7430E8DE484E -name IM_MOD_RL_thumbnail_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::85236603-D71F-359C-B235-98C77809DDF1 -name IM_MOD_RL_mpc_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::94300805-117F-8337-A9BF-41E10D8AB437 -name IM_MOD_RL_cmyk_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::618A299D-4A28-E37A-D4BF-9209B594FAAF -name IM_MOD_RL_pcd_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9F6572D8-6BE6-290B-D4A7-A0D4E4DBAC23 -name IM_MOD_RL_sct_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::942E63AC-F579-0D17-FF56-E2C8CC5DECA3 -name IM_MOD_RL_pict_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F68DE3F9-742C-D8EE-B2FC-FF9B37EED8F3 -name IM_MOD_RL_gradient_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::C460E29B-38EE-6FC0-757B-69563EFC3225 -name IM_MOD_RL_icon_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::AE00BD3D-734C-78F6-9078-C04749F4652A -name X11.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B70ED455-A480-56E3-3BDE-E06CDDB62C04 -name IM_MOD_RL_jbig_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::CFFC9A5D-2902-FD37-DBD1-6800C7C0C1AE -name magic.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::32DA3775-410C-0391-7ADB-B58028CC04E2 -name IM_MOD_RL_mat_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::AB64F079-1F8D-BE3A-731B-4B20ABD20289 -name IM_MOD_RL_meta_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5A7F49E9-119A-FD9B-8186-0BE6B9DCF210 -name IM_MOD_RL_gray_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D92B4157-F307-64A4-9AA5-C5AA1F138E1B -name IM_MOD_RL_pwp_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BA631BF0-CB17-D0EC-FAA9-D7B426457DD3 -name IM_MOD_RL_fpx_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9EA95108-72D5-13B5-2BD4-87CECED9B367 -name IM_MOD_RL_pcl_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::3111AC7E-2387-AD7D-253F-979195AC4EA1 -name english.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::14C1E910-6F5D-9540-7430-6B0B92311EB2 -name IM_MOD_RL_wpg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5D7050F4-177A-03A2-3DD1-A7DFC968E4ED -name IM_MOD_RL_pdb_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5BACE29D-FAFD-E673-16A9-D22DCE6E0655 -name IM_MOD_RL_label_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::25F84452-26F7-4305-B405-B1D0C7D072D2 -name IM_MOD_RL_clip_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::807E6FF7-2D61-F308-BA2A-BD07A213078A -name IM_MOD_RL_pix_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::1A951976-DBCC-9FAE-190C-B24BBA38A97A -name colors.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::8608BB2C-6CDE-BBE7-39C6-DF83625D5BFB -name IM_MOD_RL_cin_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::CBE1DFDA-7E32-759F-346E-DD469B1CE1F0 -name IM_MOD_RL_bmp_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::7AD432A3-5146-4966-8C8E-85ACDCC8CA7A -name IM_MOD_RL_raw_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9DC22033-0F40-26CC-9E09-959738F62855 -name IM_MOD_RL_cip_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A8C777EC-AEAA-6B3F-22A6-CEC28A2E5058 -name IM_MOD_RL_pdf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::ACA1A829-27AE-EFE7-4EDD-01D050A2E0A6 -name analyze.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::C883300E-0C2A-EAF6-D72E-81E8B99535E1 -name IM_MOD_RL_mpr_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A223D40F-EFC5-31E3-8E33-B90984080A3E -name CORE_RL_jpeg_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::DE197248-9758-A368-6058-B72C5169E0DD -name IM_MOD_RL_wbmp_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::FD15A9C0-5C14-11CA-AA27-D66D638E58FC -name IM_MOD_RL_stegano_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::6668D58B-E040-328B-4AF4-14C738C172BA -name CORE_RL_jp2_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::871E464B-4566-1FC2-55CB-B65AEB416413 -name IM_MOD_RL_yuv_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::7D7A8325-4C69-B9D3-C832-803BCF999B5C -name coder.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B0A3651D-19B1-09F1-8197-1E58ED2CC704 -name IM_MOD_RL_null_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::AB877243-6DAE-BF0C-70C2-F2D702B16231 -name IM_MOD_RL_pattern_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F571F366-1737-7E65-5441-DEBD166DE247 -name IM_MOD_RL_plasma_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::93F18CDE-B871-B2D4-3C0F-7C1B933E1ACB -name IM_MOD_RL_pcx_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D1567C76-29D0-C200-9FC7-F7E1399D3011 -name CORE_RL_xlib_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BEF1E1AC-9564-EA49-2B8F-1AAC9F6A7669 -name IM_MOD_RL_caption_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::2D14864E-6A39-FE03-4EA8-CCE7AC94487D -name comic2lrf.exe -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::27CD65A5-D5F9-C982-5096-65298417EE61 -name IM_MOD_RL_url_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A273E901-0B63-390B-D44A-7240491C6F59 -name IM_MOD_RL_info_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B39B27EC-325A-D222-01FC-F6B3BC92E99A -name IM_MOD_RL_hdf_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::BA634D39-716B-C895-73DD-2E5FA3CA2F9C -name CORE_RL_png_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::35560FB0-A7BD-54C7-C799-3EB2922BED2C -name delegates.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::FCE51670-E4AE-B813-6CFC-A7A9B627F72C -name IM_MOD_RL_matte_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::D10DB719-887D-4898-DAA8-8F1C6A4203B2 -name IM_MOD_RL_mono_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::78A66F97-ECEC-BFEC-75F2-2FA2087927C2 -name CORE_RL_jbig_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::FB74C41B-3F08-A9E8-B38D-C7C2FDFE9560 -name IM_MOD_RL_xtrn_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::ABC0A7AF-B14B-09BE-4756-76C8FE771517 -name IM_MOD_RL_vicar_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::F69B9AAD-EC2B-5EC7-5ED8-1395033DE0F5 -name IM_MOD_RL_psd_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::66CB1D9D-9995-F71C-155D-F1F4AA3B6D40 -name IM_MOD_RL_uyvy_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::4DB66BC3-4C48-C763-9BCA-9E831CA1FF0B -name IM_MOD_RL_art_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::EB24F574-4226-6404-B069-7B46C04988E0 -name IM_MOD_RL_ycbcr_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A9990A18-D6A1-AA14-1EDF-FC43D8AE0C7E -name type-ghostscript.xml -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::5B72558A-192B-76EB-1BA8-C4CBA43C6C05 -name IM_MOD_RL_x_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::A3937F85-1D17-D3DD-2DF5-FB9FE4A99ADB -name IM_MOD_RL_dng_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B2C41CC1-EB2D-F7E7-B22E-0C154C4C96C1 -name IM_MOD_RL_html_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::68A62902-7F48-6E7A-E5D3-1F58C895B409 -name IM_MOD_RL_tim_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::E5C83E45-56B1-9BD7-7676-07CABD98E0BF -name IM_MOD_RL_tile_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::084206D9-98DB-DE2A-19BC-FD17A191096D -name IM_MOD_RL_xc_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::43BE7C18-6369-E035-8390-2E13C8CBB33C -name CORE_RL_zlib_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::EFC4D6E5-4FC9-25D5-B308-8CC8C13EF3A1 -name IM_MOD_RL_gif_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::05A8646B-F100-4803-5916-4CBAC154BFE9 -name IM_MOD_RL_sgi_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::1B354F22-4795-739A-A47D-8F2D99DFB58A -name IM_MOD_RL_ept_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::B6725A29-1F09-2982-6BE1-29062A90F684 -name IM_MOD_RL_palm_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::445BD28F-0E70-B452-15B3-9E0C353CE345 -name IM_MOD_RL_ps_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::183A1789-2ED2-D555-AE4B-B7EBC97EB1D5 -name IM_MOD_RL_miff_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::69178142-77D3-D7C5-74C7-6F1597474123 -name IM_MOD_RL_vid_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::9D84C810-6DEC-5831-CFC6-AD0543D95881 -name IM_MOD_RL_rla_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::514DCC61-0BE9-6C5C-A970-170219D3A87E -name IM_MOD_RL_magick_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 +File ::AAF94AED-250D-DE8D-14C5-FA8BC05AAE74 -name IM_MOD_RL_djvu_.dll -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 Component ::F6829AB7-9F66-4CEE-CA0E-21F54C6D3609 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Main -parent Components SetupType ::D9ADE41C-B744-690C-2CED-CF826BF03D2E -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Typical -parent SetupTypes diff --git a/setup.py b/setup.py index 9150a28b90..4a2ed4f372 100644 --- a/setup.py +++ b/setup.py @@ -48,112 +48,140 @@ main_functions = { if __name__ == '__main__': from setuptools import setup, find_packages, Extension import subprocess, glob + if 'mydevelop' in sys.argv: + LAUNCHER = '''\ +#!%(exe)s +import sys +sys.path.insert(0, %(ppath)s) +sys.argv[0] = %(basename)s +from %(module)s import %(func)s +%(func)s() - entry_points['console_scripts'].append('calibre_postinstall = calibre.linux:post_install') - ext_modules = [Extension('calibre.plugins.lzx', - sources=['src/calibre/utils/lzx/lzxmodule.c', - 'src/calibre/utils/lzx/lzxd.c'], - include_dirs=['src/calibre/utils/lzx']), - Extension('calibre.plugins.msdes', - sources=['src/calibre/utils/msdes/msdesmodule.c', - 'src/calibre/utils/msdes/des.c'], - include_dirs=['src/calibre/utils/msdes'])] - if iswindows: - ext_modules.append(Extension('calibre.plugins.winutil', - sources=['src/calibre/utils/windows/winutil.c'], - libraries=['shell32', 'setupapi'], - include_dirs=['C:/WinDDK/6001.18001/inc/api/']) - ) - if isosx: - ext_modules.append(Extension('calibre.plugins.usbobserver', - sources=['src/calibre/devices/usbobserver/usbobserver.c']) - ) + ''' + bindir = os.path.expanduser('~/bin') + def create_launcher(basename, module, func): + args = dict(exe=os.path.realpath(sys.executable), + ppath=repr(os.path.abspath('src')), + basename=repr(basename), + module=module, + func=func) + script = LAUNCHER%args + p = os.path.join(bindir, basename) + open(p, 'wb').write(script) + subprocess.check_call('chmod +x '+p, shell=True) + for x in ('console', 'gui'): + for i in range(len(basenames[x])): + create_launcher(basenames[x][i], main_modules[x][i], main_functions[x][i]) + create_launcher('calibre_postinstall', 'calibre.linux', 'post_install') + subprocess.check_call('python setup.py build', shell=True) + subprocess.check_call('sudo %s/calibre_postinstall'%bindir, shell=True) + else: - def build_PyQt_extension(path): - pro = glob.glob(os.path.join(path, '*.pro'))[0] - raw = open(pro).read() - base = qtplugin = re.search(r'TARGET\s*=\s*(.*)', raw).group(1) - ver = re.search(r'VERSION\s*=\s*(\d+)', raw).group(1) - cwd = os.getcwd() - os.chdir(os.path.dirname(pro)) - try: - if not os.path.exists('.build'): - os.mkdir('.build') - os.chdir('.build') - subprocess.check_call(( (os.path.expanduser('~/qt/bin/qmake') if isosx else 'qmake'), '..'+os.sep+os.path.basename(pro))) - subprocess.check_call(['mingw32-make' if iswindows else 'make']) - os.chdir(os.path.join('..', 'PyQt')) - if not os.path.exists('.build'): - os.mkdir('.build') - os.chdir('.build') - python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' if isosx else 'python' - subprocess.check_call([python, '..'+os.sep+'configure.py']) - subprocess.check_call(['mingw32-make' if iswindows else 'make']) - ext = '.pyd' if iswindows else '.so' - plugin = glob.glob(base+ext)[0] - shutil.copyfile(plugin, os.path.join(cwd, 'src', 'calibre', 'plugins', plugin)) - finally: - os.chdir(cwd) - if islinux or isosx: - for f in glob.glob(os.path.join('src', 'calibre', 'plugins', '*')): - try: - os.readlink(f) - os.unlink(f) - except: - continue + entry_points['console_scripts'].append('calibre_postinstall = calibre.linux:post_install') + ext_modules = [Extension('calibre.plugins.lzx', + sources=['src/calibre/utils/lzx/lzxmodule.c', + 'src/calibre/utils/lzx/lzxd.c'], + include_dirs=['src/calibre/utils/lzx']), + Extension('calibre.plugins.msdes', + sources=['src/calibre/utils/msdes/msdesmodule.c', + 'src/calibre/utils/msdes/des.c'], + include_dirs=['src/calibre/utils/msdes'])] + if iswindows: + ext_modules.append(Extension('calibre.plugins.winutil', + sources=['src/calibre/utils/windows/winutil.c'], + libraries=['shell32', 'setupapi'], + include_dirs=['C:/WinDDK/6001.18001/inc/api/']) + ) + if isosx: + ext_modules.append(Extension('calibre.plugins.usbobserver', + sources=['src/calibre/devices/usbobserver/usbobserver.c']) + ) - for path in [(os.path.join('src', 'calibre', 'gui2', 'pictureflow'))]: - build_PyQt_extension(path) + def build_PyQt_extension(path): + pro = glob.glob(os.path.join(path, '*.pro'))[0] + raw = open(pro).read() + base = qtplugin = re.search(r'TARGET\s*=\s*(.*)', raw).group(1) + ver = re.search(r'VERSION\s*=\s*(\d+)', raw).group(1) + cwd = os.getcwd() + os.chdir(os.path.dirname(pro)) + try: + if not os.path.exists('.build'): + os.mkdir('.build') + os.chdir('.build') + subprocess.check_call(( (os.path.expanduser('~/qt/bin/qmake') if isosx else 'qmake'), '..'+os.sep+os.path.basename(pro))) + subprocess.check_call(['mingw32-make' if iswindows else 'make']) + os.chdir(os.path.join('..', 'PyQt')) + if not os.path.exists('.build'): + os.mkdir('.build') + os.chdir('.build') + python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' if isosx else 'python' + subprocess.check_call([python, '..'+os.sep+'configure.py']) + subprocess.check_call(['mingw32-make' if iswindows else 'make']) + ext = '.pyd' if iswindows else '.so' + plugin = glob.glob(base+ext)[0] + shutil.copyfile(plugin, os.path.join(cwd, 'src', 'calibre', 'plugins', plugin)) + finally: + os.chdir(cwd) + if islinux or isosx: + for f in glob.glob(os.path.join('src', 'calibre', 'plugins', '*')): + try: + os.readlink(f) + os.unlink(f) + except: + continue - setup( - name=APPNAME, - packages = find_packages('src'), - package_dir = { '' : 'src' }, - version=VERSION, - author='Kovid Goyal', - author_email='kovid@kovidgoyal.net', - url = 'http://%s.kovidgoyal.net'%APPNAME, - package_data = {'calibre':['plugins/*']}, - include_package_data=True, - entry_points = entry_points, - zip_safe = False, - options = { 'bdist_egg' : {'exclude_source_files': True,}, }, - ext_modules=ext_modules, - description = - ''' - E-book management application. - ''', - long_description = - ''' - %s is an e-book library manager. It can view, convert and catalog e-books in most of the major e-book formats. It can also talk to a few e-book reader devices. It can go out to the internet and fetch metadata for your books. It can download newspapers and convert them into e-books for convenient reading. It is cross platform, running on Linux, Windows and OS X. + for path in [(os.path.join('src', 'calibre', 'gui2', 'pictureflow'))]: + build_PyQt_extension(path) - For screenshots: https://%s.kovidgoyal.net/wiki/Screenshots + setup( + name=APPNAME, + packages = find_packages('src'), + package_dir = { '' : 'src' }, + version=VERSION, + author='Kovid Goyal', + author_email='kovid@kovidgoyal.net', + url = 'http://%s.kovidgoyal.net'%APPNAME, + package_data = {'calibre':['plugins/*']}, + include_package_data=True, + entry_points = entry_points, + zip_safe = False, + options = { 'bdist_egg' : {'exclude_source_files': True,}, }, + ext_modules=ext_modules, + description = + ''' + E-book management application. + ''', + long_description = + ''' + %s is an e-book library manager. It can view, convert and catalog e-books in most of the major e-book formats. It can also talk to a few e-book reader devices. It can go out to the internet and fetch metadata for your books. It can download newspapers and convert them into e-books for convenient reading. It is cross platform, running on Linux, Windows and OS X. - For installation/usage instructions please see - http://%s.kovidgoyal.net + For screenshots: https://%s.kovidgoyal.net/wiki/Screenshots - For source code access: - bzr branch http://bzr.kovidgoyal.net/code/%s/trunk %s + For installation/usage instructions please see + http://%s.kovidgoyal.net - To update your copy of the source code: - bzr merge + For source code access: + bzr branch http://bzr.kovidgoyal.net/code/%s/trunk %s - '''%(APPNAME, APPNAME, APPNAME, APPNAME, APPNAME), - license = 'GPL', - classifiers = [ - 'Development Status :: 4 - Beta', - 'Environment :: Console', - 'Environment :: X11 Applications :: Qt', - 'Intended Audience :: Developers', - 'Intended Audience :: End Users/Desktop', - 'License :: OSI Approved :: GNU General Public License (GPL)', - 'Natural Language :: English', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Topic :: System :: Hardware :: Hardware Drivers' - ] - ) + To update your copy of the source code: + bzr merge - if 'develop' in ' '.join(sys.argv) and islinux: - subprocess.check_call('calibre_postinstall', shell=True) + '''%(APPNAME, APPNAME, APPNAME, APPNAME, APPNAME), + license = 'GPL', + classifiers = [ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: X11 Applications :: Qt', + 'Intended Audience :: Developers', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: GNU General Public License (GPL)', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Hardware :: Hardware Drivers' + ] + ) + + if 'develop' in ' '.join(sys.argv) and islinux: + subprocess.check_call('calibre_postinstall', shell=True) diff --git a/src/calibre/debug.py b/src/calibre/debug.py index 7a12ee62b5..f6f869cdb8 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -7,7 +7,7 @@ Embedded console for debugging. ''' import sys, os, re -from calibre import OptionParser, iswindows +from calibre import OptionParser, iswindows, isosx from calibre.libunzip import update def option_parser(): @@ -30,13 +30,18 @@ def update_zipfile(zipfile, mod, path): pat = re.compile(mod.replace('.', '/')+r'\.py[co]*') name = mod.replace('.', '/') + os.path.splitext(path)[-1] update(zipfile, [pat], [path], [name]) - + def update_module(mod, path): if not hasattr(sys, 'frozen'): raise RuntimeError('Modules can only be updated in frozen installs.') - if True or iswindows: + zp = None + if iswindows: zp = os.path.join(os.path.dirname(sys.executable), 'library.zip') + elif isosx: + zp = os.path.join(os.path.dirname(getattr(sys, 'frameworks_dir')), + 'Resources', 'lib', 'python2.5', 'site-packages.zip') + if zp is not None: update_zipfile(zp, mod, path) else: raise ValueError('Updating modules is not supported on this platform.') @@ -53,10 +58,10 @@ def main(args=sys.argv): from IPython.Shell import IPShellEmbed ipshell = IPShellEmbed() ipshell() - - + + return 0 if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) diff --git a/src/calibre/devices/prs500/cli/main.py b/src/calibre/devices/prs500/cli/main.py index d85daf075c..dfd3eb1ed6 100755 --- a/src/calibre/devices/prs500/cli/main.py +++ b/src/calibre/devices/prs500/cli/main.py @@ -11,7 +11,7 @@ from optparse import OptionParser from calibre import __version__, iswindows, __appname__ from calibre.devices.errors import PathError -from calibre.terminfo import TerminalController +from calibre.utils.terminfo import TerminalController from calibre.devices.errors import ArgumentError, DeviceError, DeviceLocked from calibre.devices import devices from calibre.devices.scanner import DeviceScanner diff --git a/src/calibre/linux.py b/src/calibre/linux.py index efcb49b54c..8fbab59bcf 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -16,14 +16,14 @@ if os.environ.has_key('DESTDIR'): entry_points = { 'console_scripts': [ \ - 'prs500 = calibre.devices.prs500.cli.main:main', - 'lrf-meta = calibre.ebooks.lrf.meta:main', - 'rtf-meta = calibre.ebooks.metadata.rtf:main', - 'pdf-meta = calibre.ebooks.metadata.pdf:main', + 'prs500 = calibre.devices.prs500.cli.main:main', + 'lrf-meta = calibre.ebooks.lrf.meta:main', + 'rtf-meta = calibre.ebooks.metadata.rtf:main', + 'pdf-meta = calibre.ebooks.metadata.pdf:main', 'lit-meta = calibre.ebooks.metadata.lit:main', 'opf-meta = calibre.ebooks.metadata.opf:main', 'epub-meta = calibre.ebooks.metadata.epub:main', - 'txt2lrf = calibre.ebooks.lrf.txt.convert_from:main', + 'txt2lrf = calibre.ebooks.lrf.txt.convert_from:main', 'html2lrf = calibre.ebooks.lrf.html.convert_from:main', 'markdown-calibre = calibre.ebooks.markdown.markdown:main', 'lit2lrf = calibre.ebooks.lrf.lit.convert_from:main', @@ -51,8 +51,8 @@ entry_points = { 'calibredb = calibre.library.cli:main', 'calibre-fontconfig = calibre.utils.fontconfig:main', 'calibre-parallel = calibre.parallel:main', - ], - 'gui_scripts' : [ + ], + 'gui_scripts' : [ __appname__+' = calibre.gui2.main:main', 'lrfviewer = calibre.gui2.lrf_renderer.main:main', ], @@ -60,7 +60,7 @@ entry_points = { def options(option_parser): - parser = option_parser() + parser = option_parser() options = parser.option_list for group in parser.option_groups: options += group.option_list @@ -72,7 +72,7 @@ def options(option_parser): def opts_and_words(name, op, words): opts = '|'.join(options(op)) - words = '|'.join([w.replace("'", "\\'") for w in words]) + words = '|'.join([w.replace("'", "\\'") for w in words]) return '_'+name+'()'+\ ''' { @@ -82,13 +82,13 @@ def opts_and_words(name, op, words): cur="${COMP_WORDS[COMP_CWORD]}" opts="%s" words="%s" - + case "${cur}" in -* ) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) COMPREPLY=( $( echo ${COMPREPLY[@]} | sed 's/ /\\\\ /g' | tr '\\n' '\\t' ) ) return 0 - ;; + ;; * ) COMPREPLY=( $(compgen -W "${words}" -- ${cur}) ) COMPREPLY=( $( echo ${COMPREPLY[@]} | sed 's/ /\\\\ /g' | tr '\\n' '\\t' ) ) @@ -167,16 +167,16 @@ def setup_completion(fatal_errors): from calibre.ebooks.lrf.feeds.convert_from import option_parser as feeds2lrf from calibre.ebooks.metadata.epub import option_parser as epub_meta from calibre.ebooks.lrf.comic.convert_from import option_parser as comicop - + f = open_file('/etc/bash_completion.d/libprs500') f.close() os.remove(f.name) manifest = [] f = open_file('/etc/bash_completion.d/calibre') manifest.append(f.name) - + f.write('# calibre Bash Shell Completion\n') - f.write(opts_and_exts('html2lrf', htmlop, + f.write(opts_and_exts('html2lrf', htmlop, ['htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', 'php'])) f.write(opts_and_exts('txt2lrf', txtop, ['txt'])) f.write(opts_and_exts('lit2lrf', htmlop, ['lit'])) @@ -185,8 +185,8 @@ def setup_completion(fatal_errors): f.write(opts_and_exts('mobi2lrf', htmlop, ['mobi', 'prc'])) f.write(opts_and_exts('fb22lrf', htmlop, ['fb2'])) f.write(opts_and_exts('pdf2lrf', htmlop, ['pdf'])) - f.write(opts_and_exts('any2lrf', htmlop, - ['epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', + f.write(opts_and_exts('any2lrf', htmlop, + ['epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', 'txt', 'lit', 'rtf', 'pdf', 'prc', 'mobi', 'fb2'])) f.write(opts_and_exts('lrf2lrs', lrf2lrsop, ['lrf'])) f.write(opts_and_exts('lrf-meta', metaop, ['lrf'])) @@ -228,17 +228,17 @@ _prs500_ls() prefix="${prefix}/" fi - echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") + echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _prs500() { - local cur prev + local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in - ls|rm|mkdir|touch|cat ) + ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_prs500_ls "${cur}") ) return 0 ;; @@ -284,7 +284,7 @@ complete -o nospace -F _prs500 prs500 import traceback traceback.print_exc() return manifest - + def setup_udev_rules(group_file, reload, fatal_errors): print 'Trying to setup udev rules...' manifest = [] @@ -325,7 +325,7 @@ def setup_udev_rules(group_file, reload, fatal_errors): break if not called and os.access('/etc/rc.d/rc.hald', os.X_OK): call(('/etc/rc.d/rc.hald', 'restart')) - + try: check_call('udevadm control --reload_rules', shell=True) except: @@ -351,9 +351,9 @@ def option_parser(): help='File from which to read group information. Default: %default') parser.add_option('--dont-check-root', action='store_true', default=False, dest='no_root', help='If set, do not check if we are root.') - parser.add_option('--make-errors-fatal', action='store_true', default=False, + parser.add_option('--make-errors-fatal', action='store_true', default=False, dest='fatal_errors', help='If set die on errors.') - parser.add_option('--save-manifest-to', default=None, + parser.add_option('--save-manifest-to', default=None, help='Save a manifest of all installed files to the specified location') return parser @@ -366,12 +366,14 @@ def install_man_pages(fatal_errors): f.write('[see also]\nhttp://%s.kovidgoyal.net\n'%__appname__) f.close() manifest = [] + os.environ['PATH'] += ':'+os.path.expanduser('~/bin') for src in entry_points['console_scripts']: prog = src[:src.index('=')].strip() - if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', + if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', 'markdown-calibre', 'calibre-debug', 'fb2-meta', 'calibre-fontconfig', 'calibre-parallel'): continue + help2man = ('help2man', prog, '--name', 'part of %s'%__appname__, '--section', '1', '--no-info', '--include', f.name, '--manual', __appname__) @@ -390,18 +392,18 @@ def install_man_pages(fatal_errors): print 'Unable to create MAN page for', prog continue f2 = open_file(manfile) - manifest.append(f2.name) + manifest.append(f2.name) f2.write(compress(raw)) return manifest def post_install(): parser = option_parser() opts = parser.parse_args()[0] - + if not opts.no_root and os.geteuid() != 0: print >> sys.stderr, 'You must be root to run this command.' sys.exit(1) - + global use_destdir use_destdir = opts.destdir manifest = [] @@ -409,18 +411,18 @@ def post_install(): manifest += setup_completion(opts.fatal_errors) setup_desktop_integration(opts.fatal_errors) manifest += install_man_pages(opts.fatal_errors) - + try: from PyQt4 import Qt if Qt.PYQT_VERSION < int('0x40402', 16): print 'WARNING: You need PyQt >= 4.4.2 for the GUI. You have', Qt.PYQT_VERSION_STR, '\nYou may experience crashes or other strange behavior.' except ImportError: print 'WARNING: You do not have PyQt4 installed. The GUI will not work.' - + if opts.save_manifest_to: open(opts.save_manifest_to, 'wb').write('\n'.join(manifest)+'\n') - + VIEWER = '''\ [Desktop Entry] Version=%s @@ -478,10 +480,10 @@ def setup_desktop_integration(fatal_errors): from PyQt4.QtCore import QFile from calibre.gui2 import images_rc # Load images from tempfile import mkdtemp - + print 'Setting up desktop integration...' - - + + tdir = mkdtemp() cwd = os.getcwdu() try: @@ -493,7 +495,7 @@ def setup_desktop_integration(fatal_errors): check_call('xdg-icon-resource install --size 128 calibre-gui.png calibre-gui', shell=True) render_svg(QFile(':/images/viewer.svg'), os.path.join(tdir, 'calibre-viewer.png')) check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True) - + f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() @@ -513,11 +515,11 @@ def setup_desktop_integration(fatal_errors): raise print >>sys.stderr, 'Could not setup desktop integration. Error:' print err - - + + if __name__ == '__main__': post_install() - - - + + + diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index f35c14d493..780de1d85b 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -142,7 +142,7 @@ If it still wont launch, start a command prompt (press the windows key and R; th calibre-debug -c "from calibre.gui2.main import main; main()" -Post any output you see in a help message on the `Forums `_. I want some feature added to |app|. What can I do? diff --git a/src/calibre/manual/resources/logo.png b/src/calibre/manual/resources/logo.png index ee3f19baa694403ad0a421b2f41bf8523f3f2842..42b9568956496f00a3b707126d35529af745adae 100644 GIT binary patch literal 9261 zcmV+|B+}c7P)ht(u001La zNkl@GuWaisn)vK+$tGm^!)RI~&l8itIVWR~skO4Coo6SfV%fO6h zFg|m}hJ(j=w=uTIAdlIHO#{Zp0*OrmAp{aqqovjAy}P=*_Vv}jq14^;|Zc=B7Ham~m6*uCN^zX9B;wSMQ*kA24_GY`6pwhtXFm&u>txCqDV9%Wt^xN;RI`i#YvpqRFq&oO*~-)q$f~8}=u>Q+Sd$R+2;8b`}qcZ#`|}r%pD%XRTea zaq|U7p7^H!g|9t+$_hO&Am>JQ*A~Qm4<1YooQa3x%MeKt&7a-zuHXB^e5rXa-F^R!*3@Hs`8x}|_s;3?uRb@k`pK^^ zcOE&^Rn2BkpHpk`f-6V3@$%y6%Hs0N_Mfo;`+@elX1#TQ2tbF4eRy(m?xtI=Qnl|M z5%K<$jmLm!Zf@?fnw+m5p6X0D+R^8Z9XWE|YhQXv_0*z~^`(W2U;PW$z4FS-_TJWL zG+w#5(wYD^-u&Vh-95f(2Z;jiFZ=73L*^k7lPtLRtd~IKQ%O&Ro z1Ly7@;peV@F^!JA<^?}@{Tn`X$6x*IJAU)Ft*?98)x*DZ!_FO7?%>ANm6cbWnCT7! zjUBtsd-1DpJa_PG4<5Bop9v?zDD<9xzS|IW=D71)^@TXGGlM04(ao2I6&cj{qtCW` zfA+ujpFHs7zRI+&6aAL`}WPsEB0>P zarO8NFTeHor~l#upLy``zAtUPn^CTyM7|)+qTe)Dg zmggTITy4e1HY<6t>ldFlQ2hFSj}QLy(ZiA9{v*@L+{XOEc{>N@xa*MSI(|ZU4@%9<}#B9eqIwMt<`Z+jq>g2Kb#j_8sa) z$=$$=26E52;{3PVa^n@Wj{Or7!3Y0&mIt1gnaT_gG9Q-NXOjIt%6z?XVz&Fmzx;=# zH@t7tmz38!MN&V;V+U8b>$?praa?z4NnU-;H55j7@P=27bKa%b?!Ds!@56MaP<~Os zVgc}x9@bhME&v9V_BFD=sp+N#y4ialfAn~A!?hPzf*{a2Uq#K(7U;$rVE&1tb6E^31DCs(l`coX6 z&hdfIA8KU=_BFy~#z$EvLx^@vJ7cx*f#E0Lp zquB1UC+u_xyx5HlLTmPMtT=$N7GK1;U@MM#KN`7QX#`v`(egP)FOJ;62 z;01*%Z@zY?nwxxr<)#g_=LMdh$HXnN{%in}l@8|M!9%>|wJ%mLyJ%Yd?Z@tQ-#OTu z1iaC~{7cRoQG*X0X^rahcaHq*=3z;1S^ z5!iFXMQUrsJVo3L7}>Ow;n;~YhdXql99|NM&0BN$#emofe5px9fK&wvIW03?306G2xF7@(o}O^Om(0N z%vG{@ZxTo6^WQufKl{>;dU@AG`USR+#$)BY*!XDETJrp#yL3c~+&HRG!_O7C>w!c3_m4cjnt`TY ze%+1@e|Y;PB*t>&^eW?{9+d)Iao#5NvAd6r4VCr4w(*VBMmO^83!~xt_MJ9ch61(H za6I?Q3;3Jr@`%>{$ff7z_~=&__{_a0>HyE(J2qGt*uk?dD6nnATy0`@RcHN+rlmM+vB+dY*Ga#0- z|3~XIpamp}<^JFK)Z)g^?PFlDJgWxFIq~f$7W%@~0pibp^Mrl!=yKUPCr(VSCg*IZ zc*VRXik!2~byhnj{%;>S6={9in_uo2VDf`sombyH7!9s8ddcN`h5|v458X2pKYD1s z4{Y?kBlV?Q|Ktf@N}(3&omM8y%fQYTUOtr1)z0NTpO|%FIPZKL zEM%Hh&jxK0sLeNv96Xihi{CyIuQq%0SwEV2u>Jd!445P{G|ArAcfTML-u$`<6=!{z z&J3#q;uH6t+e$vu6-p|^R>z?UkpJE-T{fSIpX#I5{lHD_%y`$fU)l8@6vwj5Dx+lUY z3A1+k{p+oBV^1%&oe6tw?F9-?o}I*XvYXe(eVM(mKT?p!=Dz5dbq4i~Xs$CRmyMjC zJ=4!C`fc^Wk20h81VJ!V8>;072CK-Npl7=*x0b0-HEG`_ob=qMmU+7ZGl~Ga*8tbkGb_*feI2XAeG-!oX7*A!s*3V`dnH%&+yif0D z_Ts*O_dyWZz0o?~ZUb9_T=2Z-TywR*W5*8iex6R;VKJUzx_6phdxcPVbdJO_V?iH) zFf+EZ4v2R4{`D@`%4}ExTKd!y!9rb7t#lZ!ST>B+@|$;EwtMfhp1phHmK{hxM-s&} z+ilKF&vWeLDNY_gNoV17+chSR;Osjy!;2Y1`g86+0FCVBK53>_%&zw--Pe}BzXyXO z1L6fQyOxq)#&jL+uu0gi6L%WqjX=g#I!6{E6+E@h#rk>@Wq>bd@9Q(MKbc#}TxDJt zYMZ?$Pc_-T$ud&vamhIayv>`r;(6Dx`=ZP7awVKl^b*1TnGUT3OUyhyL3#Q}vHrC` zxU{!CF_f_(ml@k1k-oxrGsD!n(cc8zm3!OQ;N$N*T)&K2z!2YBRootv%< z$a@W*dqKdbA3sRD)utCl;2DH)80(np8jeN*!KN+LijMXJ#cpp+1e=+`eX;EObG%M4 zJ3v8e^IjWx_itOx13bpQg4^V|d zzVzF_{ht^gFH@|1iF@u5>RrG4?#gRl`$`^s=w00Y=Ev=mN1u}Fss?4hM65%)vd)ki zq9lqGolj+RvATFT8pw?43wK}P-8w*)*SSbv8~S0^=w{C%isO9gktxpIQlOe|@Ve&* zy!#9P$l=;^D2!L}J&(vZjxQT(d4)H3kkv;%Pg!=oI=qauWPNVAT&h$`#e&w#S5heF z941LzFASqryVvdX!c}0p)9qH5RwmfKbBxNs3`4_M?e#yemazBSKtVOE68}?b+zsL5U)16q5A32B5?K{m)R~0ya zbHp|0N8EhqFrU8X(*!rX9r9JAa18i@pfkttgMZ4$?|3h={UZIIcf9`Qd!EYij(5DB zJ$v_1EBWZ80XD>$n6R_T;?!X#4t|d(9^cQSM`IqHh*(&BnkZSJRPGV>oP6@h2eIN} zN~KlC$332!w#1>u3WqN>QiBl*D2vQH3L`m4Cu04OslLT({4@_eyn*1_TTwbd3P(75oIS-^{Q0j?+IT*rZ1EhcGKoVpb0zy#ijYN>C^wg(Qj$4uzCZ zt!iebyR57<0ms-T4;e#eCc$8E&f%dkF2Op3#ZcLtCtu5t0E7HsdQAqv7T_}A1;C54 z&+@+jL297`ba@z=tdN8){Lvk}|2xyHcIv$C<=Yt=S?2avmUuNAdHl>ijxRom2x`3W zy>I9I;6AzwWoDOPVR41!(+|@)wm>;J4&giqg^k;|q=(Fn;6w%GIfM{&+7^LC3Wx6t zmKH7bddkj$nt-08I~ifD#R`iS8s{7ai^Gx|3MdZeEA53&Av0_@a1pS*Qm&j+Emd}w zf>Nz0^Pa0G;@HZBTXoI119xOBaez$$sEpvb2BNo$h?bGV+xXO>1y26m6mPj@GZ$?Q z83|7C(kpjU9NCSRuhN+LCiUs>qjTf@@2?%CT6DN@5!1Ao?motDL#-I3J5YE$(c7=~)>&`Yf;-?V~GW}z)?mxygmkv@Y`uLtE zu^KHjLiXoLeGy(e!q8$81rD@Muhr`YYZR3MK{@ZyolA&&23xRr!b2cQY=V^*k%KK4 zZj@J6uDz>2V&~W;i4zObBtgNy;0m5wKim}VNv-zbhq)TVrH5ZT?T^b}; zNKjD|ui1rg1{ZY^`7(CP72Msd^VJVcaBi`|wh_fpC18Geo~KT%FfmnU+n7(KpeYwT zjBzB^o>iG2Ha!ENYcPqxSkPX2=gf3OVmyjv!KU#X$EMqajRadYpaPWBDF7I(4Y~Y= zy}Yq?I~VW14A12ta#&+9ZHsNiM3X(-l%-fIv0ZPc;N^F8;_f!!P{x2*BLpfa5(JXK zbnzQqL^sAY7jV56I1r^_Y;^<2daImVoWo8mVq1pJatA4)lvmU$emVv0C6tu|l^W$7 zI45u}i$fV2z0eRPV5}nu(tBrTW0F|mYs=t>COlyXS7OY#1>ulRlDHU)MQKHYRSw+u zIHOA=3|%&cw=DoIFtagcGNSib2Nzk?uwpzIXM1Vu#se#d&jk)=07wl2;raOG99ksg znjxx_N{wqT6xM zVQ7gX2|}P!FEO(-v5X=qgh&_}^RN$FdJ8co&f>q*M7Dzw1`U`>%;AZHoOkkE{L_lu zwjxeJd?F-15n`rdWJw`%g2CJ%=MSE%53C#>Uza>doer@?dO7^c5W!G{Y$PDSN)7E5 zT-3qFJ&ckV=}^`nq)ML?P|QgJU!s&m$~4!o)`3h%T-bE@?Yi_N3N1+tQaSuU0>txk zvDfK3mCHGXMl{3_E}K*cwL?1(Yb-H_z&T_dP7hAHxkskOP@_gN6eCL#vzTC45=2gd z6yO9okz-SSBfw79W{FaZjHgm-JgfG78sX)jSVJif z>*XL{f%Y(d+#u(=__l`^by+(01UUqoM|?I8<*1f?0xw4NQWxk?!TNJAo00+qB(cR> z0RnEiWn@I*DNW~8Ow=)$qD6ZWVFWP-D=k_H7;y4vc*6B;j{+rR z;t)BBPy&}YoJ~&*j0U5O=7!6Yt?AKB2vY{&3^CJFG>nU#lpOc<`>fP zV5KT4m6U5PBqD4W%%H_75LS`c7^4kBI)aKPkHp8_vRS64h9GfSxl=%#j=nPvXQAYk z*iaaiz=goK04dX+8C(Ve*5X`}c2sIakVob!$l@q^a1+7sRtjV1P#W2SP#%RqGF#Dag(6f3Jd(O0T1_)T z3@E2aOwwOQr#zTv+RllocorutE=idu`Wj$u3P1um5wNFvE~LBPywnAp1Do~IN^l9n zI)oslj+3A~gpepdK;;F#GWY_d&}apPK&AAQ5@Q{S&9D^Na9f8otks4f342y2Nt!JL z0ptr>0QKdi1Y;znlA~7hnK+FL7h_>ef-@HFJbI>wQR&2}GFGBf>~gv{iOCz3aaiMU z8mzQn1TL`%BftpGubzvq{PD;{1t6BG3-q1Tvc_G5I6HlIAOub-r1nu>fc65MkZ1`~ zrlof4(%7FEOJW_yK#~cfOL0gw0BoFCYmCDo2m(Q&s1(p>G-H<}0?)JL^1|YXI%i^% z#A1y_IS*?b##pQ~6l*#1n*xsXj?<-wwFYM_PNzADbrxsLStg9-Mk#ptF<=a^DF8Mz z9(&e!ti|;ja`lwvJbxy)eOUrEYX;oJ|+Y8>F{v=D5ZNGWbC z#)^~${WA;2>zYW6bxE&hkwT&rcuFXs(`=fk(Ev}w;GhIB;j%Gt$6#%O6apnQiA!?< z=|Oozkrf(DCDSA#AxR9@S&RmQ!5EXeh6QC6JImVuHUqv~OVR8PQ@wxf#~dyl%~UCD zIL0G|9ZWIK&fWeda31KRpDGMylIyM)^*-#kW4s3o#00`&MLLjAB2SQes6F>1$ z>nw4%XAn{%mFw38Y?83jY^L?XeBR>uA|YfYT24qzDk@qk92SGYVhPF~I;WTlXK0uP z)+Hoyf|U-d9LAYc7m}2nLw=2Il`Umpl{*OBnsnVtTXs!O>Of4E39%XJdtuENif!6H5gJC=qFP?9-E8f0GB^A z7XUn+xt}muP35C>KT8(A`F0CQtafdA8J(s_n2mUX(-tQ(4anR83%jd3DSG)`&&&lxDuUt%ec-2g(gNKm z%;LI$d|pDjmcP2Z9Gh+zayb|u&q=_BbEX|N(r_jKDb(5Wn8i^$rwZU^qd7XRP2$q| zgOh1WZk#u-eU;H1HN4r5at z=(C`r%T)bJ`I%_|u3yhvQ^I}}_}7m(icFeINC;hV` zCW1dU^8ZNuk~qnV1j3QaOO%#AkaRjWYBVhfL8U4Hp@<2?xfo*&4vP|Ay4>qhwGS#D zmEof8(v4=~ITDv(;?!l3;7C(pG7V5xaenQ*pYBIaKh}N$T8cFdaO?7be+@Y>actAt zp@VWo;d{~pqBwTlh50n?&E)_@0ciH7le3{r$+YH`xD*htD5-9)NI*=-GsHw#o2q_V zA`@wK$fPq~X9OE^qt6fkmzGq7kSPdf3H4LCK^(^xXH)Qe52QT%gQk^*g>*;Tz@Q*s zNVTCimn3nR7E`s*2qDr*5eDJG;5iiu^p1xoO-L^-$49BbXEiDt0D)jbVGNxrDkv$k z(Ok=8&XRd;fPa9)QfsG_5F(opSQFxs5b+~j;D>}UiNXY96SQ(@4N{){amMWIOh}Rh zluJ-5>Rh)Iuf`1%cG_Ltsx;_0fpG?31^6mJNkw5O5J2;EG~=(@MzO3an2rHyQF)Eb zNmS9pD|?WGF*SxxjHMAKs7B0u)3DqzZgQ@ zrqZdjOYrg|>2o6ep^5TKNS#M$jS&4UJj9(&i$>!pLqj?8`8-O={+j;G!hFkhIzp5y zgA9)brG=i!3ZO{jc7CiL4ME&5cPPqw=C+#t%YqU<)Ly4UG`9U zh4dvt3oMR;ETAopW;dbRh|pS52^1qG&HBw1HY;@Id`Zz)_`+fl3{)zv=-G7SEhw*m z$_*lIhyqz(`&z&XX*&fC-ltQC0PAh}!tAw+*Qb-vXyi7|m!9jLNtQ#&|#pq|(k zJ+G0g4&{fb<_0M10VL_X00*U!0>MB~=+=AjX*r+^^>wb^GxxDNF#`f%-T*{5ryfI3;M7HjR5E_?2 zzFMF%TJjg_;oL-WW%GzjPpQ&fyZn;6Ozc@-?g+#mO?gSP^$^T9jlhN@y+78l00PiR?Gsjw5ZGjX^m# zo2S(@Xs!Aiof<1ECR$!9`y;~@a`^xtaF#Q&p1U{~R%tJXwC1|hPq*kS^+-a4Rz6aQ zBCs%P=3T4U6dl*&%;F@EFYM>(rNhj37NUjDQrM0=ZR3(9omY-(X9;_1l9g_Yq}Rck z2xpR%`$8a;LMRXI2dI3Bpio5`NikpG^peNKgH2YN3oO;Uw7M~Ik}^aJfv+W%qR+@c zz{a66y-@UXrQXVl5%2$-ldP=tjFL(<8lgv8uAU2f)W34~a_I}7U*y13OOWmbnr)vB z+4qsdocaEYU7c#pgw1e?bT42Js0hI&fSc~lbU%LdGlhfm$K3Jy$;ocqnHo zS_bN3aN};Lw6^WWLd!(qk~PVyvnF)TC0SZ0gpgVY=?SHZO8dh)R~)Eq*rk2fWB$ax zdaGv+TW6P9+hX6%)Ldtjt^if7)L=2EFKYMV*~Hin0&fSt13U4N4gFr$6-_9QY70QZw_*6#nFp}!sXJkn0T&N);S9#{|A|> zM#g%PnI!-K03~!qSaf4@Wnpw>Eo5PIWdJfTFgPtRI4v+VR539+FflqbG%YYUIxsMD zGJ9MA001R)MObugZ)9m^c`amNbY%cCFfceRFf}bQI8-q>Ix;ajFfc7JH##sd#!5$+ P00000NkvXXu0mjf2#Lp* literal 31560 zcmV)6K*+y|P)EX>4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55j)S9!ipu-pd!uXCy!YnK{> z2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~TfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec% zEdXFAf9BHwfSvf6djSAjlpz%XppgI|6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{ zS7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){& zBsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25 z&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)P zCDQ+7;@>R$13uq10I+I40eg`xs9j?N_Dd%aSaiVR_W%I$yKlkNCzL=651DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm z3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdil zy+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTy zOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N* z;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!P6gpNq-kQ#w?mvCS^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1 zgY$@siA#dZE|)$on;XX6$i3uBboFsv;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~ zbI`-cL*P;6(LW2Hl`w1HtbR{JPl0E(=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$ z-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKa ztOZ#u3bsO~=u}!L*D43HXJuDrzs-rtIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`sa zEge|qy{u|EvOIBl+X~|q1uKSD2CO`|inc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0E zRSM;Wee2xU?Ojh;FInHUVfu!h8$K0@imnvf7nc=(*eKk1(e4|2y!JHg)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY z_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&Rp`ibn>#>OB6F(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA z@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8j ze`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZN zt``^}my^G3e5L*B!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%j zPvm?ce<=TG`LXp=(5L&88IzO$1Ou4!{O>iCf&c&j24YJ`L;(K){{a7>y{D4^000Sa zNLh0L01FcU01FcV0GgZ_00007bV*G`2i6P;1TYkG-n~lz03ZNKL_t(|+U&h~xLj40 z_y1XYpP|M(-{d9%LIPn5vkWrIBr+)oiijv`BZAsCIJMfefUWJs&?^LZq;+nsoLMO)_1M- z-K&KE;-QKKVn6^71i*`+Tf9dmUN?Yz|LOOI_w$c|dma`Zy3OwT&hP8N)7R*lJ4t81 z33u2*geA`)Pd|?R-F=vW*OL!lkCw~CZ#fqZ+7L;{?|kLfLjwTMj=-LG3EU`fXZemh8m$X2B!1xqRMBjU&-of~ww9ra zQ6*9(p4glJ$$LZcOSn^!biVl82F1iCoZyxy$3PQM2w2Ti=hzGn`iPw>16J;iprjRG1-GJB#QnU z6QiBK*UZjV0v_2+NdFhWGFt#A{?L~xpLz|k{NyytyAFz&enE-zzHhLlw?OP6Qp9XR zP%*SI(iY-ENZJuy$6m+_W^W#h--X&EUIWRWwM8;pSf%IzJ=D;3U_bkx6Vr7}Kc;j8 zl6WL3kfeavBS{nD9Erz~*a>kE;v%B-#_3#FQdDMhb+SwSOJ?Huo441-|AP^|nlLo6 zv5;BH$Ukmm;M6*ehfgKwshvwT3Iss}l@#LNpjuJd`$1kP0f*N<4)#OrpR8fM>geLl zLBM8mZdB3NLh)C5RQ1X@DC$hyBVi)1lTSoZn?VCmdfVH`wmXyfoA2U2mvevy8_*ab zF`cO1Xv8*OGSt@wXhMh_^Dlx;(-dcbv3D$Q~|IPd)eZ(*MRe1e~L?hxe3ez=H~xyBEl91N8S$lbL`uQ!cSE( zA{4PL^ zDg8Jq+wsMckS>O#jhLp1@EFsEsx$Pvlw&?z;q4!;@ZR@VdCz+j4*7y*O4Bg?`_Q!* zM2(^7?c+FA(!cr?U1z+Px(IW?4nx!iTL8`&8WXN+-z{#S^29#cB4JsZ08zY!b$o67 zca68d9dpPb#MfT?Z%C>c9j!A7wT9X!gwz>o4WX7pq7W%mf??>+l%w8T;gkcdPKJ;Kh ze;IE2A<^|W(Dmd)Y=|Q6_1+#T#9oM1F;+;LVC$Cc{=qVN9(VP!Qr+#0Mo<3`7yW$iy0|0V*2Ne@D#pU$lARa;4cH$O~{5XiiuaGhuOR698!d zlP362d4m6h*C6xX6pr_I!C#(=e||mY?gxp!@lAGHzL?+Gh*I#IC(ERY7(@C}!i;YV zQ%0dbSJrfSTA5?s2bJ-DBnMoM&_=ZjH6S+AATd~@8cY!4^W2S2*}WAu1`M z3{fdyR4^#wK+}mEs67FiHjqvbW0`PQtqJh7UW3dl(Zm1i4Dn_TBLGWQ!rxp$vg-iy z(Rc8}<%@Z&D5z+_3DGE&YEUweTFdkwDO1-gk>qTsWITO&&eK;1#tuaC0&!}r8bRw~ zc#L{|drDJwM9j;e1!6K648cqAE^b0OGEBcR(33fm+|xn{Z9zpaaZF-Mlx&5vEfH5H z)AR8JTd`ORCPKB~4YMsn2c_(IQ5#j6*#0*OssHcV*hJam|CbhL%iKqF*=6{>_Ub(O z@k7{N4>$Y*`=u{Y_%@t<627;WPi1XRu@NEyL1Q|g>0Mws;EF&^b1F?_T`zVtL+4yT z7>h8@L*dYnAmV~VS5P0i7NT)!F8+|{$VF<1Iyj9TAyue0MC;F34!RypnxU!ZnG;~m zvC2p)#`!2zq(Utc3Z~L?$39H|*&5alJjG&ZlKVEn1TY-;m$FmOh+p<{#k6jCeL{Q3 zz(4J%i{f>~O~rux4)n$+?u8q^WclSG`mXuY^$PAuKgKcs2Q1dpZ=UJr{oAB+ zBIdjcar|aBd~B|60Uka17Ub5q03urjqU1kgRn9w)=+Hw6X^NhHddKh2m_c;G1@O_2 z5?+5aJ?}V)#x>VaTD+M1jNx_OLr_3PH6)pmBv8u?hhM0aF<5-mtfI@e$It&uOtX!+ zfEE>uXoqXqUz1FJAEAh8uU&u%7C?kTB`pzR&~i@tx{J_BqlC!d8UcOaDns5<#;ZtM zBO@C5YTV60aRNuZR~V~wq1hsq3_imA%g1Pui+KIU$~xH#;kac77i;!HpL!n=ANo|v z$Y{3nPv(VcD8&hP<&V~O>Y=aNq}hz`*=s@L=zBX7k-a%RdghdA1vgz8c9j0);G>JM z_V;6zJ5N1ijPE@-Arcauuwb3J_;Un~Dsuf@#Lg2Pe+b2c%hA(k(B!^zsUeBK8xFqYUFaJkKdO01N$-MMO#Bi)+V%L z#N;StL;`l;P$XSRvC=^HPryN7bHRubrAW8OOuCbJ@0+mAE^IW8*%;G$>eCb>+nL}b z0S{smN-m+o3}$|PCR69uiAOiFDP7F6NiVSU@{Gdg5(2m1SLdEbRf`|`6H zb89?&*%-B2G&vvNdxPV*LB$26Kx~z`bP?|wz2cJlaThP%EF3#EF0;no$wPTBuqO{H zJAT%1)&t79AX795xZq2Pp?778gT83!as|OUit)e`r>JZ=8O;nfC?PYb8xc%5BtIze`p-EQ zO?9mLwc;mA0oDq!fkcE#BgnCzz(y%iGbYX(_&EoYt$q(=4HJr5A~+L_B$RB0>O-$% zpYQe1JF<{P`@O`=pDggEz-gPd^#rE|;jU{F9=rj)&(t$K6N?i+KiE#zlXFE5g!N|#cD%LV#}1-k3G&ApnI%MRvuxr z@(c^FZqlN_7l9xSH?D+=F^o@{!j6X=!r0@L>H6}=Zwx#(%g6_}{i5;XA5Wm^(Hcn0 z5g8SOiX>D@$CYk8=htt@E@RdA_T}u`u5~}>x^x3CM)SFQ{2I=e=coKU{>I96c>r@g z@Eu^mM9B8n;4k@eEWjRtnk!NBX4G!W(J>rdiujKG5o!#ji-aVD$O};mBm?V_nkU-+ zR%70FM$Eg{5vP67u%dl6~$#dKH^AjnGVmc9qz7Qx8*^e&bP`^xl&>>D_y=%e8~_ z6a(~RT~v#dbkq_xfgpmj1{X&Z0&N@dmGqeIDpMzIgGeEmEFl>!5oa|@o2rzGm?Rj| z0*P}f-6!+nt&vpBxftbh`cGV> zc0%~uQSL|Hf7#*uZ084h#usydFU-xTwGg*~DhQY)BR=?iM7nXM23i0w9EM+gDzxfI zzRpPKmyVxb+!v|`C75EIqCP_VMPtyQG*nFuVk?w_5{t0w1rc3iimQ0CSb6SB$Uxd- zkruTC<033Eb$>7?y>ArPTc^5yDNoN@%=|BUTnMOmLgsL#fELDROO&z!6+xU52N*{% zL?*Txgu;-J8o^3TQuNUKosFzNxykr80gs}`VB}wb9_x@+-E{&hY?PXNw-ove~&FjH>wB#U44XG3AKMZX1 zxSGk3R0?DyB75vB(5OLMM2cKhOGcnl;=|pE+&;c3H7y(&?x)7EPf#pa(8LI3g~1zz zS@(gsAY%cY|88g;iOCBI4g%2)~?EK>ht4={$9-2XpcJL%kGcjPAIPW}ZW#nhyxz~6k+4;*tQqzMuVp+9wLZRs$mxUUTNqK1*2}5(bCH- z_*@~G_o5n%G4i;;Q%EpDQAs*FMVmlni0g;;=i#+;*m=_nTo}jTTI^)s@aXrC zaJGPvfX;mzx@ixjT@YNPs`Vs@t5Y^Tbp2`;d*2!} zuwfl9*5>ip*=lTu1=q1yYC>ZTP@SC!#bgKjCq%WbJ`Tx*V|8Lmdf zM?_JHxUe8Sbd8?Kao=ns^%7lqH$B5Iv$*Ry9y(hoCIu7FQYR%T0ZKzWHtj$j&0ACv zyiM@FK*WMN&4)QtkLK#GVHW?Q0~!NpQwf`EXPZT39_X4Vx`wS5ILoeB?m2ba8jUE& zhZMCyB2atYu*YpMJ_KWBn13nncu|JDkJ+aT9s^0#D3d z!qU%Ww8+Vf8U?`zN5XbPdr;bSq`q!NKDjNW4b8Y*bmy+son$_X`^mCvAPNyCi?B8! zw$qt>)&A`Jw4>D1LvN$Ocxf&V>@kn${-#BXmNXn`P=%NPyPnGVaZKU@;pGSTgdb+g zL<$3xrYe8&duE-bXe`J$U=$aFmM5z9#YDliIpMa(Uu~87KfYG=iL)Zky`s%y=UK)^ z3~IoXHxc&wR-mF#Ux&<_0p21$AkJ9pya*wwaA9AW_VNYpDDo%2ib>0;Dq=IR5!eJ% zX<>$LB}`dHUUDMCWeIc72&_L;Xk~^Xjf^%3QWj!YrSH0JnDz7wX82W%_KdLFE@R=j zO`1k60mEuL7u~;J@_V`+KOj5bmJ0Ejw1*H zHYWHMqK*V)lZvkZEfwE|5ya}SI${D5$`!zq!2AhI6Hfp~w_e~}Hq)`>pCY1MiA)o( zQKt$e7|KqFBCq8HNn7Abh&RDGBZA4s`0~;x__`1RLWVd6V>+OTK%-$~-%sG9n9#iu zo;{qf;v6Nj7T*?p#e$21O%-FyRPUR~&X4!A?Px}+x`5xmc_S;{+LjhJrtKjPo^B%Z zOLp4z5|(A9q_HU}=_c(%YEUglHfhpadmbUY853`mTnAE;P^YX%aKL-&RBgbfLYysO zab-Twp0a_}Z*0-PQM9T0nn}Q#8CeP%o&8 zP4LEIx_02&k;RkMzF^7!G<#B&_&n0LwWr*-Poj`-r<*7+3$(R@8kX}TV#D6AG~Sj zQt}qCgL`uQtYdkqXi}YjH%D)JnH`J)a^m2`#@LNJu*d!{^YVF){9^&9YJIR3jRRmx zEZX68zNvxQrk4IGixxpb zA!-E>MHyg^Jt|06!Np$H3=Gd~Y+$5XBXU9>FJ;4_+-wy zHldb4$XBtX)<#Dk=b;aIe4j@oNMVv5ACa))^&jCXZ-_R$NZ<1}^0zn;PY7NL@oKCn z+s6L%Rr#Vf1i}T1h?oNFLylWuo4$+VY{vOr%! zyR@D#<07O!9{bv`vS6^x;QGL_!Hh>f=V|tdW*DQnaVEBy0AluMzfbMTUMn`yOj6p7 zB`o@Si;Q4B#1d)SWd?hBKSNhLRwixAF30AM5Dl}gI!JHubcdID@=-;*)QCY6 zY|tQr5@Gz$_8HPog%SE!=GmQ!u_~HlT$w6N*_&H-JC6D3Wa2!hM>AxHxAN_U-{<3E zB)5Xz?!M6V7;8p8!yV=6^tRyOS1il9pAjzl0?gQY6oC34Lqmhnx^~uf8$|sgz;$h?m?X;M(AEroWll#PX{`*78UW!M#u zv(xBOb|(W-3e{0&o@1JXaC3bRJfipqWtI-NE)CYKWmp3w}Hbg9CN@9qr zeT3a1cartBq9MD4Og~N_fK&w= zBD7Q{aR+k3`%)&C*D*TOO?h|~ORLZE`?suN_3;^n6!<(Oq~21-K<^MY5A4XCwey%c z`Vw!m9<_pahXgN{NY2u;4*He9`H7E6kkcJX5WJK$ri7LT*|_&P{G`-Fciv>E-or>7 zQ)CUg(}=y-;$1GAAL#Uy-MT6jpu_lmbhA7H_m{3G$E|7aDOdzWWg;xn0)XEIDzr2fXw~2-< zW!d1fJo|U!j1MXSPZ4srV9eMo4{XJDLe1%g6~I=5I$gk*-_8 z;F{<7Bn3ha&ZAaoC8F1w;2&)K;^{Y%>1R|WID(agI3%5X@T_CFG47&UYNX|EHu{1R z0o0QW?Zk@h_T`3EPjP19jHueimpQjRaii)d{^!!gBWZiXlUb2g}4$3rV3qap~oW;L7&_ihEEh+FoZl-`^1|#^vcQX*awjg z(=dxzaAr=s*HNg)c_kQwd2}k%KClZrZBU$jkxiur+l_5xzV+3(-Wn-RU`_a{C{9#- zOr$ZfgJ3I^pE!)ezt=@?xrf2gl`O8ek>(1P_pW5k2igP*rnw z%V={G-8RA-A*6i_k1k}Y2*xX3M64nQR;YiqIrG53=7f6{K~d$<2T_&wAAs|xSY-Nt zx2{UIq&%%uX<4D#igfqqoa}Hej8^f_e-h26qiQhaHt|44&=M3mMho@hWu%Bi)k0K` zDVv8<4yb59jbqbM)rVjn`VqN*=5Y}3Tjb{|W3t*g8u`w2q`T)H*9nHZv*C{8K zT2IuWEiK2meVRFMYSP#zBasjR)+ME0WuLe5>8>hi$l>9exxn~Ny(x}q7fq5V;YS05 zT-qL^_DoZjDik8>j0rVN2*D70M|R*x`Ch4uTBRG&h(rw%9HL5F1K1c5ixdq8cRz-w zHoZje#zpR6h`fqqFK)YBwu$Q~qw;Ez2mW6z$O~a&?OCT|iF%$o!ST>H3Kk4u+6C5S zRthbVO2X{>EvLSh(AC1k9$PLT1dO6WP&BqgA|w)1jx4bxSUZWy{&?PW)$7^!Vo#wO7uE>SWGi3~CH?2#ONTR;8L5Yy>p0E2O>Ssg#i z{Owk<{#}j`oM|aZJ4nf~%>n#FIi@>~7=QRSPAf*}_Rgqln<8(L#1V6Mn8Kwp9{Z7I z{4*sYh*%<`xQYZrJY`>ge%NREQf(4l)gCHQLMe%`5lCp0ScBIF-Nut9F$O~=N~stj zBEqS-!fE!&w_eRD>L_mbo8SwmX{&Pg`t~?-g*->CnK?R zUdO%{4A9dkQ?da{lNr)!Ov$FR{S_HSwvI;nEOXCV&!)pNaw`}TV&ibGpTXbm!frq9 zrC#(i(1K9iK(i_!O;jJ|;Zs(#Zbyf2XOSxd#C109cM6}kWqf;-+LJf)xj2T<2K7-O z6ozv8wXoB+_bir`r(L*LIAx0ww&Owt-yi!s`1t|A>tpSm{n za+PLl4O6=Y87;=?Y7EmwV04#bxovnk1KDcdO<~GWF46g)ooyasr}Q+w(?ZpCuzcwR zIlgl%Bgg-SC6^p31sW_?Mj+HptVX?y@r?}9N|4pZ!tb9)_F9hyfnZ)aLZH(Kz!Q)# z%7}TCM=tN7=l(Zw^ffD3HFGA@H$)_ok{HF+wq$M zdg#f7U`A>7)ah!BGbRz~=#xBffv2D%=nnWm$tmwXt9}+{%xCAV__jmh-8P5v0<`LvK8b+uEMw`Fq)~v5q5XffnEc#t1Dt z7*2Gro3V=a(t^dS{{<)tiV7BQOJqKf_V3B<+a1Qn+7PL=L;^&DcMh*g@ST+oqJdaF z2_6#)3KO$oWF7JFT1u5Zj7^BeV8jp%Vp~33^UwUtW1r>n7oX#NFZX{Z;x`w1ezcp1 z0|mK6w5uX_?${i~$EtRB+HtI-E8?h7X zro+F@X-Q}z8ml-mbfnNwE!Z${E4TlkOgWS&=>Z)0(JpH3lvDHVL2@u%cr9 z&*Mp4X{O0i_t^Yn8P2|oR|%pjhFnros^ka0hl{$lq0+MhAs=IETE`;17YmQJWm)SVpAY1<;_UYSr$M`7S$Nml97emRU7z87jRzTtnWclASGo4S<>yxXU zIRm3puM(EM_$Lu~MSrBV`9t#^L3&}(aK zeEi#dN?V{}!4gd37Y^;o*GDbu8VhUPY#hC=V_;<%qfv;dQ--}y=AS3+OnS{7Yvp9(!l`&1@A3*>E?u-ytS+AZR8OC5jLzQ_;*fYmT6xnF=vR4W_6E zBOYipT{d79wMe0;dK`i=DJG1uv6fPCbq2?mu&DMjFKxeq)u*?}T!;h25GpWu5Z9%H zY#474J#!Oh`8HkHq=WIIWopy8pghRPn!C+c7#}@F)BrwLqg^4wlEQWeaQn6gG1@hW zspr&8Ex~IVGqd)?f@!wD1bUn_j}+^G!ZWt5XmuO;&M^QmKYXN|cI@ zT)hZjma^oAk8#_f1vA?>@nNs)empKBdfQe}t3tR0)f0fwiHAb)2pCb?D8mX};{g{1 z0)j8cY@bI=UmRo4@8GRJ6k17h7n$6sV(kPqMguCKvJ<=gbP@A*YB9c3K@kV0t?^@v9!Rf@J6=|epIU@6I{S-djNOu@CG)% za3@n&-phsJQIiui1g|(xW$+!NYqE57;mGg7SP@f1Y7=iY)zlOBux#H?acx%@{Yf`n z5=f(n%m+LLYHN&*1+u&il{#^3C`VvYVR(E4tu-$)_RP=t2xB0=qa+GBlB6WIjMWN( zGT@0^5%3y%KgemVGx?0W7^3Te3s8G9l3Xv*eJdG%@^i9gx zi3;m6`(8{a`vQrCUS|m=A_|H(f^i9vIz+-2t6z1Z^wLMo9n7I$3OM%+PaVCE)$fgo zTZM0z6m19ZBPC#krYa>N@&T(3uVuV+QXF9-!zrycEy>6tO|%G}XlOT{-Q#%X6wtNu zK|YKMWXUGc&=q5YgUC0BZy_T?j722V;F4epPokDO?0g>A$8{!^`bdl=MG-tf3%pKn z4wq9hDIrb>so-eB@N!D??q>S(-*Ji?gILHV!6sGAu5aesNsWrj=_>azHtP^>cPm#(w<+Z%qx&F}kb{-O0E2SrDN`^_sI<6q^#xdgLDvETV3g{m=~9 z7>kf%GIH;=NZbr|`elWizQmKKfr_)#Q)TC7pj}q7@b6iapj1er9%?qCl-D`vw*l^1 z!ZHbDBh(rjYfWv8^r5R(T5=qEuw}NVHQa0>x2tSDo z-9U~4u{Jf&s@{nzVgfc`qMVS$Sj}-o8kf)lZ12w8GUF}GsZFL@?n6-`^#tee-Vsy@ zArP#^cBQ0I1b!TG1?{5A*owKx%MbEF6DY8l!gqQqPnpd>P1>CzcuH0=VVvG_AFF)^ zn9x*DMMYaDOkULHyNo6(KXhhRqvrz#Ka~c&URz=8DoqkO~&PA zUfyjv%RcIGi3bv5)2W%Mf=*bSf*8#*nnv+e0#s@ccQTD)QPqOB$r zMd&pDvf!OTNGo-;ondOzn7`+{m|GbFiK$volGez{(V!E#2?1j&W9A|8`1+5*Z_FG?*Pa-O3Fp35bE9h;I{$GGZYVU`5rBzqMe) zsh<8NF+-QZlmZI*kCB^aAq!4e%gUAeu=lUq)J2akkyZ?e>0?qpnQfn0%es#_ z@}iqbt%Rgv@PM6Y&6q1V#u@7^k&Zdjt_K6&BTQ#_kOv{CorpL)Bv`EC^9^XEEP3Py z9JcZ~-bhYUb1|giRf3;=8h<}^7s`XPpctc1V_G36F4xJX?8b^!3%GyvFh_=hlE85n zJj;jQHgxy5zj@wX<2~PAt~YKCu1Y#`=_VjX%=y60imNK#N7Ncn89~#65XwZ62MHK4 zXpv$IRuSR*;DhCGrPd6Syr7*iCJ;Ag@Mh^W24~xsm>-|CQ4ZKbK#%*E3ifVzI0zEmd$w zeTJ{(9^cL(WTe$@s3lapYakJ&qC{FaD#qfH3VCZaeNmaV1VWHbgtsDcLL@p8dT@1fm1DYCaCg6n+d)@14N=O$Q!jTj)mrc!HW-Yc zPc6ax^VL*zuNOyu+{xm+`pL0!v0eqmUl~DFP0+%a&d0Krnh}Nyhg=#&8tC)y!jB$> z7}EiXh!B;*l?>HF$c_Fxm4_ml3=Sja*fVNe2fx|Z(2UKhp0 zfYQadEmNIHFTFB6Bng$aV6A3WGCcJ`LN-Ei_&fOdonPa#G&{B0*fM;~UvY)zL`9n< zoy5A)WlZiHWVC2e3vE*G@jkeClT$-(1b05nNFq zB$z@l-LshUx_2-q{U6l5d9>wMRqy+mYpq|mo6}aGR8nb*bbycmh9*%!kVX*@yC*gX zDssI(hu3TK)ay`uK197<6|Z`q3h4DQK=6X}AQB*SAuUZvQ%Ne7RHd5JpS}05TWiht z$8Vp?p^Qjn46b;_IHOMObIv|{|JMA?<~zUhJ2UnrJv2!rm#RARw zPvPT7?_dyWE{$XI+VdN){1ZO&hQH=hFMZkRmE8Y60Khi@y*{QaRbo(7gMvmOZw-mtw-~q)x)sfMCL=9>lvn*n=zqmCTAa+V!yn|E?pbEz-N$&~#U_-allODw9oKR6ao@&g zWP>ghtDuFs_rI3kG#y5CdS}eRt9j2=-^Hy`Fbp*X37ft`aae>HCnU*$u^(fa38Tq6 z&9RUJ&X+GOE@Yef$mlDlI7!I;hlm zAw@3w7XIhO&t$1w=E}MxBn8VG_u{_rULHR>#$%kYVqilfgU#bC6mzUMOYD#VLp_Ri z9SdV(u=3dcOpd;7vXy*(!!rO?k$2yTQ-v5L(rJijWFrQ-`PnW1@E2Zg_(|+N3o3&X z$|Se!841mtC9{^jOAstHZab~wVJ~6i$z1!M=kcPS-@%SiPM-GY*_>W2Y8=M42$n=5 zsqrzT8B1v_L8e8`v@TW!OF=&@vUd_ujo=g`h@0RT&RocN-&Onpsf8pl*g`d09~y!$ zT_HZLLnU>+3H6wk99eH4V@U|*61}y%8OAY7lVhxW?v1=c*GYBKsc^ZxHAxRS z@FYHc@wFTspW?EG%Qzf_jnz|3?!A$C@^ie9%{2H*dN=(QuWTC(Ih$=okqrq?`dHgVn=CXFj0h{P;Mf=bo+sV^Ilf0*FiOyXssqglSHGOs&F#kx&Vi_m zPTt8v3#%u-j5~Zi{{gIrRPb#s9`AC>&?UwbA5bETZh)!Bnsn02ap4+bI6QwvVE^~p ze~Ucl(Ujxy&i6sN*{wS0auY+O30Nv(lOR(7PTH3sA9z`-No|;YH|+l)oHJ4u2ppMJ zGx3=C&knqY^%(lX|14=;-*BfgqpDm ztvW<3o{A>9hzqVe$>B?DCXZ>QO|=G_QeOI8j?7%nYj6Ks|KfU`#~ITF&?EuxF}?x% z@VM{djjh2(PcIrUmN?wUL+gj(p_|!t7M2Ow$0V@egAGz}T`0on`NsC!bxz3_m zs%n#^FTRWCoxF|5Yb~9POIu1xkuH#FO%Zc+yvBTD*__$Urgn`!wWyC#IQr7N4HJd; zf4=#*2vv`w9N&tyR=+alxg^FoKrv`sL)$rwcetb?G)au(7u6hpiRJDShHHLbxOBNI z$-mNQy6Vf9CpffY2fJ35Sel6he~<&4^UNLkCLa4EEn2Uz-t$cCVeb8*it>p$srkz1 zX#t^N&;%m;m|JU^OduK~Orp@6EF-%D#lF4B+%NFf^>zM+F~v-R$tgn;N@zKf3`DJMP53{2rcr{7ak@1D#r~p~8@>L-t?E`}RJ8F_A^z5?n$( zUZcAEA31pPHXa`vS{e+AMr_@4^K4x8V%}BE)6|eUhczBcWd8DNdGlQ#;AiUfm;qdI zaj94T&W8Rr-}~>S99MZY$X`*=Qg3_BX@LF+X)1IwM?y5#M{RwkX6lx(#OMsP>z1Y7 zBWWT=B1d`99pd)aw6y8-`1aQp^tB=kF68|2h|PXRZb~-oA`5HBxcF~!^1sO_jF5<) z?i5Fqpe+*@Xj$UOt_))$m60Gx65&hlC?lJ;!$mBwV~CPHnyNG4#D~a7k06@{sb<1LrSu)s?v_}aRgzV@h9HIGyd1F^P1&D zr1b{P_#`@*<^GK$^y@L>^`nGp!n##f!vsk)%DkYeS6IyEDai?5Nz{QEz-2Gt53YU% z9~HG(VU3kQv<#~eU(m@Jx6{;r*^G^E`_KH&V3t-k86-VimEgTFJn#bk?Cy8+tIoo~ zXYyC)9b|U)Tx`{n`i#}(doW*k8&6(6%rnCV7zk0-VX?(t4nOUcyt%i7*>sV#jU)!h zgwU*#h)|QDiwB7ZpUzwE`4~T-!K50T+xTG9{P_pb7r+1Xauz@R*Yb6ixIOEt>et^u zlJv2$+fpD1L3OJsyx0nf2!x>5epK1G)zGTv!+!)G!Df(+4fC}nH7#`tkGUCn@PKOd zJP20tzK7c=DYc=Mfcl!sYRBBs6WTocB+Jjw=_P`rB}$*c_=SA`tJc|=8IU#+V^6U$ zn=`B}ed#0hgq3`bU7P2#|My4S{a+%g-V3NUAq|p$A#kc`3pC^|DVrg21Cw}mQ=64?Z*!W9R zgYnxytakdf|3<2+TEPF>j~Ne`uAk>kU|dJ;&y=Q6!X&U>7~O&M|D<8;piE1? z{Boh(1^snowU2E}B5Md%6>6fbNL>fZI%%k!Vyh^ch^p}>_Rwg8PD;ThU(%NFl7qn*X>rp zKsvyjTp~0U=`Yd}aV}vnyGZh!-{!Rvu_(QX(uNIMEmc|94?A~G&&v94r;TP4s`?p%TV-~j@k>fpu#xNt6U9DqBRq(Vo3Fn-O z_yiel!ej;wIh{c^f{8+I2h6D>Q$wnjEOy)P+-8j8RizFDX=rU@+a^j(@8*lIggWVw z`lNG&rXcZ_7SE)}F`ALY0a-K4%->pE6{BQr!-a=#=B1B&Hvg+wWJJ=*%X$H|nCLL- zx>oJdVJ^M>pSZSFT5qY_hN2iE^ShzQS;%u{+$>=-BCmwyllRly_!spBUv1UrWSMz8U}79921BQT%#)skrPD#yZRhE}-iGsN zdQ}bFjL@6nCIS#58?`d3kx{C8!|MrBMYH#g zi%C)%IitW9g>;tj_#{O%WGbNe9?Fm3bQ7Ne{y(Pm+c6C@SEq@DLNPDt|} zMe;bl`HSar`KwkqncvOL|9OM8iydjONLex-7&WQ^bvRRy$CR{gcgE=W?Q4WpH}WqIS2G8fZrJ^I1-)qFEpBfzX~-4RKS`uD5v|`wf%hs3L#% z54in1(I`HO(k+O`?@?X-Kak!-7&F0YW|EM_P=ary4Wo-&j{Y8)+%j_tzU4PH&eg=! z5`%VxcO!yp6vBYQ?_^OU)+JcGi-mG8JO0~{bkopqf+KrxK76P6?G)lmcn4K(+ujKLnw8YAJBOO0G#-!Oe)_&{B!#p^D9> z9Z$rPU_Gb}#G%ETl*Fc(CgSTc);h|zMe8+sd5`sGL~cslz_Ob3XtB{pA(=mik3Z!{ z_+T_#++UzFeX8{(W_t51nSdG2(oRmWOEStw+AZyRRO2P)9`|D2{i#1?pN|}vp5Ks% zM`{7`X&Ce0P@(G8FX~iBmDVa)kQS^e+Nb04_Aqu7n=k<1tx}=2-Q;xEDs2$lL~WfT zGbIMotw0c`U|T$$RLt5iXHfRZd_|L=!`_LZu_>4X>^ZWJh1VKnJfb0BV!@nANn=Bu z78J4UxX2Mqv>2_a^8(ix3UzGcphhs@C2vd1WF@$0Y4Zij=*gz}oM17r>pgkniJ>Hq z9wi}~S;lcf;UkiyY=#y>P1>7bWH(90Qbb2GdoG8b{5^cM*JF3OgBUISrlrMEPc}$W z!L@7bNC!;9nIT3|eibZx001BWNklo+dC5!AEW7NnE`Xz<9W*K3x<=LjeI8y6KJvx)_3mXym3PdZ1fV+QH?iB)PQk{ ziGA{NLbMe%HAs)5Hbgw6eP(?@N{R_}ln_;uQ+M+62X5l6|M(fc@4Uxy-4mYA^=*Y| z1Fmsw)T>C@62JISuHAb%hYwuCea#vJBLr&*vFQ{%Oh&0fY6qxIG5tL>kAD&WFt?XM ze+Q<8B3Qf+i0M{IMr$D%FtQdC!dK=tW}5PfC5orOk@V(Cs^b8X0=q!RT}O?{^i1{Z z-T1U;`wNE-5#Rl8RAGm;yao_eK^PphT=F@?;v|w@j|t0QAA{tPNP@VCx&-nj%B9z- z>01mAvuO$UU5Kt->If#%?5mlKK=z$t`Qjto_uLKEmUgo1_7SW7KG{T&u)*dKa=*aN zl`*yJWcx+t8Mcv_Ry2vn#MoUw$q+H!s%bnzpX4+5aPO0X*nZTI5S2@w&EF<1^^se7 z?wudv+Pgo-HTQm!r{Diko^|w7JnO_4c~-N;IcpE`_+1zAnPP~~UANqNi#Z(}q6rR% z*?R?FTDX8)&VMq;ear4B3;{zIpra^i1!Dx`99Cos2z2S=X=b( zhi~?!_-QrzM&N;InA!?k>DSYE9#yaE4In=s(;yM-dLVi|=O0a!&!}3| z+;tiH&`&_LhM5g?U}Lm~1ds88(^g~Dpkc$Jvn#C8;zdZ>nwAlF{qQ~9`Kkeh&NKhM zCvf>Y7MOo%l~ehMBMT{6Ge^;kDd%#W_9zrmA5eTZ^PpXsVMRzN7??goo0ChelUza! znqW5$GnB}RtDvbMG0>iF$62j5jhHM1ts~tH?$F2=Wm9kUvTVL7OLGI zn_~B@BAW@B@6)yhyo1meOq>#wwV{$gbRe}r5@>8i`GRFmzECg{k$NY4-*kXWK2b86 zyNnA~5|SdJuZqfuiED^HM`%$5qbaF)AmHW-dd-B1h=@&ks&{>YS6}*c{>xy7^EYa) zZ6_w8wh~1Zn_KcS_(=~MIr>?CV&NR#Hop&X3AXJx12GEfAv(btn8{|4&>2ZACnVaT z?bwu%=))>qDoBVAV=v(hkj*%}9pKf%=3(}WLBygl;D8>mG5r8UPf8zv4mj zSXKjU293nvnNGa6HgemG8~*3p12?|{Gp?g7r-9W3CVj)sRi()zGZWaghMrs?RzVVpr!348)@5;v2L=-m=P7FJIuYW{tVZ>>5F{vm8V!4mQ?AO zDlhQ~q^)9NgV#9CH-$tDnVioh8&BkMf8HY>TZysS0Mi0WQ`MBdg`|j4Y+I;l`^HsG zkc~b`EA)|-qxj)ImQB)?bZRkCx>3NWXpBVT291Ms|UPHAmj0V9-~(AzleL1@5Sxhikr0(Qod!LfdD58B5w9s$8keduX)DNPj;R{Ls6dau0=@D7Cah+iwnJ}&a-|QNVQnjdw-zi; z6Y{~+c*f1&&U0V=tz7dXv&8->Rv4=2 z6F(Zc^FrFC$NM;LkTx+^mCzCqMe7W0*NiqT%~&I)!G;O3s-ZC$>Xv9W@NrB&38Z<> zj`RW+nPL974Qzah&wlqZD=#wGf$7AQQj0Z$L`M-T>eOLF58D>q4J@5JYWG$Htp;ih zl(AveT2vgNG8%JsErdMjc8RZ_JkFe%qng=CV{#U3 zLXixpgOC`Z8n2Utj3!GEYe|C#>1vB;Ac~-3u+CuIR9b55;wOS}bOy7PSVn_M9NLUA zzD1f1?CvW$eDVR_xq3S<(SS!O{)NPNt1REjxAhFi5w@MXKU>4uPFwQZ{=inUB|uD5 z&MW#{ndYR{a-;XWPl+!D?F%-s>}(z9zoF6h{t-w%C(rA4)e)q=c%;P!LQW<@2>;o0ws@b+akWK0t`7|k5v(649YDX8^G zEUD5thGk2cr(IH_Qx>vrF&A4VZb)8T#(^(9$UX0EDPQVQqCSlC--*GyA#qDX-)`3+J;DJqw{B7egHMsbhfPNv(UhswQ?jlc#ltoQb4O6{^^( zvf63RBLZh1BAhFRXLQoD#eKrLw+L}49DG+ai|-~*7SLp8 z2WHt?a496wa`DG4^9asHng(eef>Y-q?W|E`p4q#bL%iHc7P zj2%*>i|p_V?D7}$xDQ>-!Ox_)2+_M`O?~5Je6`Q2pDf_HHo6J?zYC@*{uyL{UNKVV2UAQCm8GL^?G0o zHlEGeLq(?-Top8Qyj)aKNvPT}N$?l-H?wg)t+;*mJ zn`hY`RrGB0A-m1$;u&A-^xgt^0&u=|cp5RFA-EYN?zfh!L5-^2g#DkkoVzagB1EHb z(an}~K9sTePNnKAJVqFdEl>O~46KkEfdHX``>#ambB(GjGJDHT1{?3=1Almm6LJb0uBlJ@Aek=Ayyk47OR4y#JA9q6|;sMi@z_ohuU!?0XprFWcD z7nZaaHMA*7457O&pVpeEgc^gSD|nl^NFX@X=xP;P2OqMPqg=MIpPRBi5*vDHPIL~N zSX@+0Jd0dI=$751T}j{3Cm<@(H%N%67y_LDUb3*4`|iJig=%eUSecuEFHgPA0pMI< zlhalIX_lZn169^3>Kx7{RGBjpsqJ2-rCZ*&clvnGdp01cL0W6OUW*v4MvuzvFKYGn zZx^okb(lFW)P2MJBxNqkx#X=48}EuF1H(?E^u&^iM+M9Jc7zTEHi>^gs7hF8w2zNi$~BS$2(b27aBgceXV_MjpqE`};WW7#&$9PSDH@{bp`9*xQAcj_h7;vpZhDf>95gM(NoVSAqV#(ggh<=iihJ>K*QDG_? zyB&kNr3t5s`j#{uGKv$@H0?Z7>WEp7MueW~Y0t97%h?*FziRsUy}u94=F&{ZG_x6)i6xg9e9_HDQzKF;Y$_$fEw2T8gW4zliH79`%lWl3 zUa$-*Wnl&Cp@B09U1 z-Pd2pWq+G7Q!cP*QgR~RtRJfN6AdDK4Dg_|E-Y@!<8`QZ=-h2x=T! z*JSg3ifq`igqjhFwHlhb&eehlh3V0ThU9@S^2!|-^VU6=al#E~2xLu7FX|T0?Q8!C z)4V2_uZ$f@PVGxF@mSNN3>A6Uq!%NJb_bsVKQPU2ZkUFwbQ)DsVE^>91wJu-teKvF zzRe?@RdOubGH;na{*>v@%ubDF1t=gSU^1{4O;KuyCP9ru>I~XirR-yyrxM=(R8Q8n zeEa`t=#2wS2#jV72PQ(WmJ}#ci?OkLBdK&v=6Zuk7*o;`J3XdET+;*z5Zkyumy>VY z$B}Ceapanef}QNT{ds)He-(rgo4q-PWlfoC+lQHT5DNt8zM?R^%#RGjnr&Qh_|9jpVRsqyl5K2 zZU;_0n!c9X7GAghJr{WF)Kaslp(A9cGZUhtdzR^u_=Vgl;OLjx6PoCP8Sld%|Wy)w_^`ugyqp8eMLEQd2|p_z;+ch!_jjsUjXh zOiP;tf(ZoE(z-}6Te~Ot=io-{p)tW|M%pT&Z%I1$=ADwbk>5ZosLK}T9X8D=W(Q<* zbJ*EABz5FT4slH3(you%j_9QW#$iH_hD^@R(@1DZOhK(6p&=z;r`S$vJxSce3as4m z5zaYwBi}N;t*hz5Z-uOl>ABf$XB@YEf4jpt5BPTAJEz~vrlIRhfH<2zUqYwBN1Q%* z`7{P5Q!kT0LYbDRVr_y!VnAb}XeWt<0ong9wEPHi=+_8#2QJy9^#u~6F)FGgDy>Hv zD^yW+e#vw9If^|g#EGhADuj~y`^Qv=F6F{6&N26@JGtvsBSu$8ves)$!1oQhsUh?& zXfjRJ3W_Qx^C^*jky}2% z3opHfkL_OIgm$w|1WycIfos*``#T6qHv<(avSPrP=JXBtwN+JyXmet-!HmslNU3bs zWp`F++X@?7CX-XNcYlCa0YMy5Jq9J4@^Zca>;~4R=Xy3D-vKNGhk*yTmG0@(d!vvDP6Jxahtj+&}DS6B1F{tRQRlGQWD9+vj&O^SWak z`#lLv)Wo!2Mxtls$=}1hRl0C*Xn~(~n)o8RCfCWgML>6IYMWriIkay2-SSHL5A_5xT`y=zS1~R*;F-sa88-@l)cMvY=|6wHd;Oj2r-B;h0l$`g4xAEeue}?x^5)#CP= zoimu=$%{qSV{?YS+*hr`kr;4kpW3Dbfzm)E;N5_YrMpOPej86;JIb|M0gZ`Wt061_ zf3VHF`bWura8u(cr?#+vYDfY2?9`cfz+2$RG(pOy6;!zmt~T4+5Tc62K+)8Q(U~&R zUIP9ZND#z$G#-GJ7b4@wVci|*+{ng(Ex6=e83*10#f^dT3dkzh|5;^}tGWF$IQsoi zXBe-dsKv+(!|OlGt$)1AhFN6pmS(!3KEui$7MhlJKBq61e(LC%J~QK0R%dFeydaGU zE)MBcAm&WuxVuAwv{ZVGWm)1_bqlxr_=xf4k$|-r42h&jzR1z@9?Ox%J>37m=j2Kn zt1%EYIAX9G)q+tKhx8V>XMP{2T!9sfiGkd@vnt3XfQ{fpu{NV=H!;;F?dnn5JFnyX z6Swo7Ist7Y7>rl60e)_3H0#qF-<(nOe61htHiX%1d!GI@D%HR$(6`%A#U&=bPNO1mG4#q@6!5G~RU(DiEw4}Pz5@>>&j{S(wK!bV``I%MWn zOsjC~YtUogg;WM_^w}{U z6HQI+Qk=I~%}F#P4GneHQF^};Io7UM#e*Cz8p6`Yx&CEKtUMi-#jKzdVzBlsh%2$19u@IqBA8f` zwquBv;}70Ka_>j@X%mUkO0Y^}QDfnMMD*V2`3<&>$UK@oR%V;gY{zvrrbhUssquJs zMrEbba_y7THbZafi3Sfpku`>1VVR3Ce7AD^wkVsgf^ZeawTN$tZGkfdnnVq4Hi;kk zV}T~p7>uT<2qtL=-jT!#>V_E7Zc&tJD||L#vQpAaYT8Vx7;)F{+{Gc&BO71Ld4KVA zo_XDatjyJH7D66-w64#fiUb!3NkF0!%p=hYlt{^_nXp#gz+K;Tiq#j?cp}-Xka?na z#?=I`Y#ia)$G*(bofqLX2Ol0GFHvywu=_FGc<>q?2(Z}O!6?+Hv!Jj2R}uJE_>MfxWq7Q9Se!l;91|$WU>e40s_B<1i_*r8Z;V5v=D76#9SpP zM8PJWs7a@H5ri10K)KX5rb$W?=a~7`Q=IzE0A3~LsJ1C4$*^SP(h|gysgThUC(q@% zuj!H49%(Y9kc?Dj7}g55<5YQVQEgDIsNym1HlN@Vzp}*WKue?1MxbbkCV^JP)Iy@F z26N!4y#3M_aQCR8lnA-Sy4Wc=MeQ`mOhPf7p-^Gg?POez>D!dXnhp>6mlgx*w8b#3 zs*Fi-FR80mrs^u*9C>&f+#}+p@UjX=yg>K4a+CM0*pNpiBy4sE8~hT7y0om6Aw? zG9s$&0Q4BAP2ULG#S211R4XE_bn4hfr`NAw<_1su%}VSUOl!NjE7xuIX-rESYpPhW z86%ComwUc@mF2jb!96=!tOd;-nJ5KgszOjvOgo_o$5~1~$@SlNic?pHZrO{1)Wnz} z@nfR?RwQ2PEXEjEdyvcf^ISi;nAFYE%jd90*fZFNm_B`1Ac;~83rv4V^eySQLR`T_ zB8G^X*!7o;BDPzSXVhbDLe-X}VwvD6204Xk31Pz8@*&ng|4yE~dt;p zDlCuS{o{s4_4F*2oWW}Ns{Pb$#e&A@Bgo?;6Y7tmR8>4ZZ}eU~-ZWEM+-{<>Lfj@W5!D;5}8f zhII)iMkgp&?*nUi$XHf`C&qwkXEb6#oM0@S$gj3Ys7aEXaXX@)rc@^2ZDc$?MSJh3 z*|T&9FEDMl)X#vimO9OOt>)%8>ST~cn?4#C{Vqjq(9Jq!z?t2z@w-i-Kv{MnQAc}J-Z%q=uRC^jE+DE|<-D3MSQv1hx zz;@}3ct#?mQo|sbw}r1NEsA;#N~hwqGL?h1f8Inc@BZoI*|r?$tU}dx%Eeaep*@2g*i8R_ za$3e;G3}Ma4%gwUDSubn##oEaa42g+-@*tq^=MubesrDkl@5FBWnA*RbIcu0DPFsa zoy$3?G(@?Rhpvn?7fcvu4viMmZm?;_F!~aQt~$la4=7=?q3j!@Ra8{f{a;`|ugElK z?OH7%P}U{0A&@yoV=T698GQ0xy!7ec!J9vFKf6sD_xc8<(`RW>TSQdqfa#^QGy7O? zl-W4lfux|`6SY%?vazAahcp^7<5MJA&V%=Uirt4k#W|xBJgrj#Hk%Sn-(Z@Y{AZn+ zeA!Ew7lUsFOQY%860pwTmd9CH>>C`d&7{Z!K*f+Q4B^>Fs9OVDtjY0y<&xxYXmglRlDY>kCC23-smxRb%GFW5@;1<1LFBpENf&8 zBUO671xXQY$tGj^I}X6HJ1J}*Lc=(;^iG+VsO)S_-9~=iHvJz1LcEj^V?c>z;Wx_uP6fm)n+}`Lyr3_wKXzoMVmoA7lK- zyrPri000nRNkl3sPX&hcS< z5=x~09H%Ie| zH}c+Fe}PZWPvfP4Via?!@N5j#L>pSn1xAbP?QXJt??-vt<{7THTwU{)+|uFNK=_wA z^N%EUo%0&4!AHZTL89Sjm<~jh%ZRF^!kG6LzH+L%9%@gPE(IK4$>o6?3)d%9`Jz-A zZ#!kikJXM(3J5kXM$Zi7;)6ggF(&R8o{{ zuse<;vd667qLm!5M3k{KMVbKCGz2qVrONM`74z-jB|pf&-u_E`wrM%B*vF!A){V@% zdG4W-28jXhW(4bUO+a^94-HElVd(LG&gdF+T)<+%=9fRn?ce+YKc&4_pVDZFfXX09 z7YH9};cvVjw3#8XLk7bZgHv_uLL80dQV;RzTD3V%Gqu;Mwwb0-DDJ&f>Zs@Ht)~hf zwp(dgZL2>IfCY!lBd6xVJ$U}vV8h^Mab>Q(#}iC(IzpNuw(m?B7{W-z;d(_ik%Ee4 z5m_Mt@19vWdz^N!Cp3#(w=Hdy=k!bxFopo*$fIU5g8M#j0r9R~*So&wH9Ry5YZh|H zLD$gD*O)aOZJ4vrhV89KXcH{s4jU(~W7{jU*#^U6kC}9AFSgOe7U_Xca>GOa#apd+ zkV2H0TA%&AU&H^LL+=SL^-YH#8$=}+Xbi!Uhvlf49%eLDH$YhNBpU^n-ot@#0nbIl znGEBJQjvEh8$IEh0CWyXGxgSJaHwybvh?1*G@J7w74AcM6CkKHnIzBXg!QNj$f%gN zQmD&H7wSy)PTKjeW3oBZc2|&gpJ4rYb00=TjJ73sPdknnNGmkgg4`y!fH@X>_Uf%2 zyX(%6@{W5y&F$My@bIzk<-UFw+dWIa^%UE8eT*CK{wTk;`4Ep^cN1R=iIZJNXNisE z7#2H>yHC+CmOOmtU-FyTX8lMs5p)M(KAZ7d1l?@bELvbro6E;$5XK#w)iR=4pmNQUcAkZl*Cg4)FCp*yBSUfQfm-2=!iFK8X9xN1nd2h zKQ-f+DtJdskyKLe-r<)XT8|8hsY&;?u?q=R*A3ci;B~;q1$aeKdV`UsQCC#4WE@d! zhGXuP#XCV?Z=ww$+4`&P-ENH&JNNO<^8{ka-JV^5<=Olw{P5fPy_;_3)cQ%*@HA}j z;5Y6=AO9+Q|MOS8BW~xUQyxF>l9Ob!miKiV{F4nh6B_49Cis+ZV3s4A^YDW9 zbH~|@z%QzBY=7YG{m4(}sWGxd#LUu$Ap0HRF9Po4+dhuWokzkv?xZJm#iB$nL=|gIlJgCpl9o>_M>d?GIF^=}Da5fTug@Bs6G+i)nVD*K zNXWfHvt}p(%a^K1Osag^@c*S^T+OSht)9(Q{T3@2sIcwb1~`|{HsO3CMNc%WGw(Wr?8$O*qDuk84G|}n#}fgH z_a-7>#+q5X>ulaYXq541MC>@ER$%A1zhP=o&73Y^H_)7Y>d|%43XvW zNJyEcDm#P8F+_GT8jvk#DO|%wJ0gF!&CUl6)fU;=XFN8{wdM4Dn~syjH1j@b$Cw7% z!=9`p!f0mef*Zi8!#}CUMoKcecIfDhjX5VzT*KKX&j1T?E$fUaCe^_sr4vsyBFOS- z+U68zQ_J|k=eXhF&u|Aza7Hgm=RIbQ{m}59UK=4aU1W5Gute13eP-jSs?!YOi$%yq z5RR<8eyVtz?W*Kp6?tpC6yn#_@;I(S_w(vQTEz#NkiQta{crQGZ=T}%|NR92sU!V{ z;LXGW-p`TXSZgDp>1bQf5RPlm08K*UNEAi8L>jFzF>$8|PU)lhJ`QbE20{~&(#AAE zri_XRZA$Fs0;JocS#`#*q zKfdTRA6P{6(QO%HLbFzatW=oNIRk0i90|opQl%?jWLeb{ePs}j6kHRZp#;QtgW;^w zKITF4QDv;JfTWq67Uca-R23R&A#^aLoUnZ9t$h7uxAAxL7qf6J zjdQ@$MB8HT!7p;l!(ZZ;hXoe*Q7r6|WKE!Hu+N`t@sc%`t%bJ=jLa-mw~BQ}87me!5QP})+7Z%W8Ha0TVeTKp+P-Yb|_ zl9#}Mr%}s7bf#IxQKzP&cn|;w2XXh@JM|>#Bw6op+d=d6( z54KhqsW~vIg; zp3+A_oZ-cp8!^11!C@*%qG1hr68M0e7Vyr01%~VI^5OJy~7lh3YYav3Qv$%j;PkrCo^+qBtD0 zO@qd;o3zj`iwa3}I4?!6PjZK1Fmn!?-8?x*b8DXKeg&64N$5vpJcXA9bo-iTb@|IU zS9cIVuvWtEI#*K{JD-Wf{=COHvJ$GV;-0oL9$P7AOx55Q6&&QR%w}~$yAEB*Igmx# zM)yu-U8&(u5UzF397-@loRHLfRHV&}5c}(<(GNIJ2${m)^f*!Rd&F*ofsvFVX>mCZ zzg1WCUF4o`sUDtm5pVuoX*l(jnpTXb2F|IvlE#&5`1azyzfHRd!t9u%@!9<^hT}N4 zhzm#3*8AK#+y;_lJvwnq%q8}da8hQBB6uW^s5ehs7;zl^8u)!u*Mf`mJ22{{9BwS0 z=KkVo(ghx-8W_uWdpLe2mnSzCzOsa?Qxq18OYc^&fUh=r4h*zjn9q#hq6#-&AV zdT8uwZ0HMN3AyXyan3aso?|giUTZq_>4~g^>Jc?_A&O1#JXv|ROY+~E%);}pD0E&Wn6m>hJ;PMN4Ys!@aqoOX(EiHNg9!HFkLP+H@3zyo+cA!NTa!7 zNgI>(5gV82a^IymuCo}ujmeu?i&!)#hB*i`spb{7TPvUUZs5_%xa7#=T)9^>aWR*xbOST+ud{$H(Smrldo+ptQ zhz27)d*(edTf-r+w|yvZoph%sjlZvOAbwp(SM~H5J@Po0zv4<{QI{{KHIz{HOvwdJ z`alzhNTrNgnB*H0f(DaObL)(_%#T5!^|`Y_MoeOcPIhi4bmsr0(z+B}5(y@nau>ep zMX#9&*qoeg%;P~4NrZVyzzK3)w>^Fs7E&C2H1e3bSAIgd$o zb(74?-3Lz5hK6o-aLi2*tjVXZ0W5%P1bmTr6U-@LmW7rH2w4#b8YJ5JMx)W0nUuz! zL(l3=$=B3j_v*+f&v$rM)eFhvT<&U_N*KcHY5Zw2{Vswek_Mv2DnU6N+QcPtZG+}{ zYbN4IL@~U@7zr0K60JPs)YH8~?vkB4LWXB^V~z~x!dF$D0GtkTqa4~R$<2i`4#XDg z4#-sff6w`(@TT%;7c&|-DB{k5&lJPir5ZX{{XV_go8*t|K;uIO(-G!qrkNs z&=p*jU+Jr8%vZp?2CnfU53R2-*qmH@`UVG6U+SyKo(-cp@;DdYms%6ZRfjZTrs?%- z$mNX5!%VEhrz=C4#v9gp(((+y_c*zq`+mMvr>O4Pw`XI6jy%qV56^MF7T$C%Pyy`; z$2?U)bSlY2D@Icj$+Yr5QYG>ZyQ=0TE$|f%=p%Im<(}=cJ2IRL8%`~VP!q_)3Kptq z3!CLi=}H)H#Q^Fd^3N3UOuy?X;ES9;{UxnLPw~ibp4&!LANXqGux2DqAo&pvD4VrT za7}4Y4re7kQasJ1SyR`a!bPyyk>Nbc%dZ^Jss>Qt{B(YeJ?hz(PZtoqL9T-h9Q4~9 zhAo%m>2?F>x3aj(%cYeo&pjIe`3M|ey*<7exPb$@hE>>Sdi|*qc0VtkuA_Bz){|rs z`DqU1*XHFq8iD^N&zR!KaE?}3iGs$G2fDu)PgAb4GX+@N(Uu*pY1K0_Yp^}d#iYs= zx#!E5a!2R-tgH#s3@bQDj|}H%u@Z*6D(ad<947+$bfvY=moN5zQux~-63N`q00000 LNkvXXu0mjfxah}a diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index a26e5e0721..cde249a779 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -13,7 +13,7 @@ has the environment variable :envvar:`CALIBRE_WORKER` defined. The worker control protocol has two modes of operation. In the first mode, the worker process listens for commands from the controller process. The controller -process can either hand off a job to the worker or tell the worker to die. +process can either hand off a job to the worker or tell the worker to die. Once a job is handed off to the worker, the protocol enters the second mode, where the controller listens for messages from the worker. The worker can send progress updates as well as console output (i.e. text that would normally have been written to stdout @@ -22,7 +22,7 @@ returns the result (or exception) to the controller and the protocol reverts to In the second mode, the controller can also send the worker STOP messages, in which case the worker interrupts the job and dies. The sending of progress and console output messages -is buffered and asynchronous to prevent the job from being IO bound. +is buffered and asynchronous to prevent the job from being IO bound. ''' import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, signal, \ subprocess, socket, collections, binascii, re, thread, tempfile @@ -37,20 +37,20 @@ DEBUG = False #: A mapping from job names to functions that perform the jobs PARALLEL_FUNCS = { - 'any2lrf' : + 'any2lrf' : ('calibre.ebooks.lrf.any.convert_from', 'main', dict(gui_mode=True), None), - - 'lrfviewer' : + + 'lrfviewer' : ('calibre.gui2.lrf_renderer.main', 'main', {}, None), - - 'feeds2lrf' : + + 'feeds2lrf' : ('calibre.ebooks.lrf.feeds.convert_from', 'main', {}, 'notification'), - - 'render_table' : + + 'render_table' : ('calibre.ebooks.lrf.html.table_as_image', 'do_render', {}, None), - + 'comic2lrf' : - ('calibre.ebooks.lrf.comic.convert_from', 'do_convert', {}, 'notification'), + ('calibre.ebooks.lrf.comic.convert_from', 'do_convert', {}, 'notification'), } @@ -67,20 +67,20 @@ class WorkerStatus(object): ''' A platform independent class to control child processes. Provides the methods: - + .. method:: WorkerStatus.is_alive() - + Return True is the child process is alive (i.e. it hasn't exited and returned a return code). - + .. method:: WorkerStatus.returncode() - + Wait for the child process to exit and return its return code (blocks until child returns). - + .. method:: WorkerStatus.kill() - - Forcibly terminates child process using operating system specific semantics. + + Forcibly terminates child process using operating system specific semantics. ''' - + def __init__(self, obj): ''' `obj`: On windows a process handle, on unix a subprocess.Popen object. @@ -92,22 +92,22 @@ class WorkerStatus(object): ext = 'windows' if iswindows else 'unix' for func in ('is_alive', 'returncode', 'kill'): setattr(self, func, getattr(self, func+'_'+ext)) - + def is_alive_unix(self): return self.obj.poll() == None - + def returncode_unix(self): return self.obj.wait() - + def kill_unix(self): os.kill(self.obj.pid, self.signal.SIGKILL) - + def is_alive_windows(self): return win32event.WaitForSingleObject(self.obj, 0) != win32event.WAIT_OBJECT_0 - + def returncode_windows(self): return win32process.GetExitCodeProcess(self.obj) - + def kill_windows(self, returncode=-1): self.win32process.TerminateProcess(self.obj, returncode) @@ -115,16 +115,16 @@ class WorkerMother(object): ''' Platform independent object for launching child processes. All processes have the environment variable :envvar:`CALIBRE_WORKER` set. - + ..method:: WorkerMother.spawn_free_spirit(arg) - + Launch a non monitored process with argument `arg`. - + ..method:: WorkerMother.spawn_worker(arg) - - Launch a monitored and controllable process with argument `arg`. + + Launch a monitored and controllable process with argument `arg`. ''' - + def __init__(self): ext = 'windows' if iswindows else 'osx' if isosx else 'linux' self.os = os # Needed incase cleanup called when interpreter is shutting down @@ -140,26 +140,28 @@ class WorkerMother(object): contents = os.path.dirname(fd) resources = os.path.join(contents, 'Resources') sp = os.path.join(resources, 'lib', 'python'+sys.version[:3], 'site-packages.zip') - + self.prefix += 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd self.prefix += 'sys.path.insert(0, %s); '%repr(sp) if fd not in os.environ['PATH']: - self.env['PATH'] = os.environ['PATH']+':'+fd - self.env['PYTHONHOME'] = resources + self.env['PATH'] = os.environ['PATH']+':'+fd + self.env['PYTHONHOME'] = resources + self.env['MAGICK_HOME'] = os.path.join(getattr(sys, 'frameworks_dir'), 'ImageMagick') + self.env['DYLD_LIBRARY_PATH'] = os.path.join(getattr(sys, 'frameworks_dir'), 'ImageMagick', 'lib') else: self.executable = os.path.join(getattr(sys, 'frozen_path'), 'calibre-parallel') \ if isfrozen else 'calibre-parallel' if isfrozen: self.env['LD_LIBRARY_PATH'] = getattr(sys, 'frozen_path') + ':' + os.environ.get('LD_LIBRARY_PATH', '') - + self.spawn_worker_windows = lambda arg : self.spawn_free_spirit_windows(arg, type='worker') self.spawn_worker_linux = lambda arg : self.spawn_free_spirit_linux(arg, type='worker') self.spawn_worker_osx = lambda arg : self.spawn_free_spirit_osx(arg, type='worker') - + for func in ('spawn_free_spirit', 'spawn_worker'): setattr(self, func, getattr(self, func+'_'+ext)) - - + + def cleanup_child_windows(self, child, name=None, fd=None): try: child.kill() @@ -175,13 +177,13 @@ class WorkerMother(object): self.os.unlink(name) except: pass - + def cleanup_child_linux(self, child): try: child.kill() except: - pass - + pass + def get_env(self): env = dict(os.environ) env['CALIBRE_WORKER'] = '1' @@ -189,21 +191,21 @@ class WorkerMother(object): if hasattr(self, 'env'): env.update(self.env) return env - + def spawn_free_spirit_osx(self, arg, type='free_spirit'): script = 'from calibre.parallel import main; main(args=["calibre-parallel", %s]);'%repr(arg) cmdline = [self.executable, '-c', self.prefix+script] child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env())) atexit.register(self.cleanup_child_linux, child) return child - + def spawn_free_spirit_linux(self, arg, type='free_spirit'): cmdline = [self.executable, arg] - child = WorkerStatus(subprocess.Popen(cmdline, + child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env(), cwd=getattr(sys, 'frozen_path', None))) atexit.register(self.cleanup_child_linux, child) - return child - + return child + def spawn_free_spirit_windows(self, arg, type='free_spirit'): fd, name = tempfile.mkstemp('.log', 'calibre_'+type+'_') handle = msvcrt.get_osfhandle(fd) @@ -226,9 +228,9 @@ class WorkerMother(object): child = WorkerStatus(hProcess) atexit.register(self.cleanup_child_windows, child, name, fd) return child - - -mother = WorkerMother() + + +mother = WorkerMother() _comm_lock = RLock() def write(socket, msg, timeout=5): @@ -236,14 +238,14 @@ def write(socket, msg, timeout=5): Write a message on socket. If `msg` is unicode, it is encoded in utf-8. Raises a `RuntimeError` if the socket is not ready for writing or the writing fails. `msg` is broken into chunks of size 4096 and sent. The :function:`read` function - automatically re-assembles the chunks into whole message. + automatically re-assembles the chunks into whole message. ''' if isworker: _comm_lock.acquire() try: if isinstance(msg, unicode): msg = msg.encode('utf-8') - if DEBUG: + if DEBUG: print >>sys.__stdout__, 'write(%s):'%('worker' if isworker else 'overseer'), repr(msg) length = None while len(msg) > 0: @@ -260,12 +262,12 @@ def write(socket, msg, timeout=5): raise RuntimeError('Failed to write chunk to socket') finally: if isworker: - _comm_lock.release() - + _comm_lock.release() + def read(socket, timeout=5): ''' Read a message from `socket`. The message must have been sent with the :function:`write` - function. Raises a `RuntimeError` if the message is corrpted. Can return an + function. Raises a `RuntimeError` if the message is corrpted. Can return an empty string. ''' if isworker: @@ -298,25 +300,25 @@ def read(socket, timeout=5): class RepeatingTimer(Thread): ''' - Calls a specified function repeatedly at a specified interval. Runs in a + Calls a specified function repeatedly at a specified interval. Runs in a daemon thread (i.e. the interpreter can exit while it is still running). - Call :meth:`start()` to start it. + Call :meth:`start()` to start it. ''' - + def repeat(self): while True: self.event.wait(self.interval) if self.event.isSet(): break self.action() - + def __init__(self, interval, func, name): self.event = Event() self.interval = interval - self.action = func + self.action = func Thread.__init__(self, target=self.repeat, name=name) self.setDaemon(True) - + class ControlError(Exception): pass @@ -325,10 +327,10 @@ class Overseer(object): Responsible for controlling worker processes. The main interface is the methods, :meth:`initialize_job`, :meth:`control`. ''' - + KILL_RESULT = 'Server: job killed by user|||#@#$%&*)*(*$#$%#$@&' INTERVAL = 0.1 - + def __init__(self, server, port, timeout=5): self.worker_status = mother.spawn_worker('127.0.0.1:'+str(port)) self.socket = server.accept()[0] @@ -337,7 +339,7 @@ class Overseer(object): self.signal = signal self.on_probation = False self.terminated = False - + self.working = False self.timeout = timeout self.last_job_time = time.time() @@ -345,14 +347,14 @@ class Overseer(object): self._stop = False if not select([self.socket], [], [], 120)[0]: raise RuntimeError(_('Could not launch worker process.')) - ID = self.read().split(':') + ID = self.read().split(':') if ID[0] != 'CALIBRE_WORKER': raise RuntimeError('Impostor') self.worker_pid = int(ID[1]) self.write('OK') if self.read() != 'WAITING': raise RuntimeError('Worker sulking') - + def terminate(self): 'Kill worker process.' self.terminated = True @@ -379,31 +381,31 @@ class Overseer(object): self.worker_status.kill() except: pass - - + + def write(self, msg, timeout=None): write(self.socket, msg, timeout=self.timeout if timeout is None else timeout) - + def read(self, timeout=None): return read(self.socket, timeout=self.timeout if timeout is None else timeout) - + def __eq__(self, other): return hasattr(other, 'process') and hasattr(other, 'worker_pid') and self.worker_pid == other.worker_pid - + def is_viable(self): if self.terminated: return False return self.worker_status.is_alive() - + def select(self, timeout=0): return select([self.socket], [self.socket], [self.socket], timeout) - + def initialize_job(self, job): ''' Sends `job` to worker process. Can raise `ControlError` if worker process does not respond appropriately. In this case, this Overseer is useless and should be discarded. - + `job`: An instance of :class:`Job`. ''' self.job_id = job.job_id @@ -416,13 +418,13 @@ class Overseer(object): self.progress = job.progress if callable(job.progress) else None self.job = job self.last_report = time.time() - + def control(self): ''' Listens for messages from the worker process and dispatches them appropriately. If the worker process dies unexpectedly, returns a result of None with a ControlError indicating the worker died. - + Returns a :class:`Result` instance or None, if the worker is still working. ''' if select([self.socket],[],[],0)[0]: @@ -468,10 +470,10 @@ class Overseer(object): if not self.worker_status.is_alive() or time.time() - self.last_report > 180: self.terminate() return Result(None, ControlError('Worker process died unexpectedly with returncode: %s'%str(self.process.returncode)), '') - - + + class Job(object): - + def __init__(self, job_id, func, args, kwdargs, output, progress, done): self.job_id = job_id self.func = func @@ -480,20 +482,20 @@ class Job(object): self.output = output self.progress = progress self.done = done - + class Result(object): - + def __init__(self, result, exception, traceback): self.result = result self.exception = exception self.traceback = traceback - + def __len__(self): return 3 - + def __item__(self, i): return (self.result, self.exception, self.traceback)[i] - + def __iter__(self): return iter((self.result, self.exception, self.traceback)) @@ -503,12 +505,12 @@ def remove_ipc_socket(path): os.unlink(path) class Server(Thread): - + KILL_RESULT = Overseer.KILL_RESULT START_PORT = 10013 PID = os.getpid() - - + + def __init__(self, number_of_workers=detect_ncpus()): Thread.__init__(self) self.setDaemon(True) @@ -524,7 +526,7 @@ class Server(Thread): if not iswindows: atexit.register(remove_ipc_socket, self.port) self.server_socket.listen(5) - self.number_of_workers = number_of_workers + self.number_of_workers = number_of_workers self.pool, self.jobs, self.working, self.results = [], collections.deque(), [], {} atexit.register(self.killall) atexit.register(self.close) @@ -534,26 +536,26 @@ class Server(Thread): self.result_lock = RLock() self.pool_lock = RLock() self.start() - + def close(self): try: self.server_socket.shutdown(socket.SHUT_RDWR) except: pass - + def add_job(self, job): with self.job_lock: self.jobs.append(job) - + def store_result(self, result, id=None): if id: with self.job_lock: self.results[id] = result - + def result(self, id): with self.result_lock: return self.results.pop(id, None) - + def run(self): while True: job = None @@ -581,7 +583,7 @@ class Server(Thread): if o and o.is_viable(): with self.working_lock: self.working.append(o) - + with self.working_lock: done = [] for o in self.working: @@ -598,19 +600,19 @@ class Server(Thread): if o and o.is_viable(): with self.pool_lock: self.pool.append(o) - + try: time.sleep(1) except: - return - - + return + + def killall(self): with self.pool_lock: map(lambda x: x.terminate(), self.pool) self.pool = [] - - + + def kill(self, job_id): with self.working_lock: pop = None @@ -622,13 +624,13 @@ class Server(Thread): break if pop is not None: self.working.remove(pop) - - - - def run_job(self, job_id, func, args=[], kwdargs={}, + + + + def run_job(self, job_id, func, args=[], kwdargs={}, output=None, progress=None, done=None): ''' - Run a job in a separate process. Supports job control, output redirection + Run a job in a separate process. Supports job control, output redirection and progress reporting. ''' if done is None: @@ -636,20 +638,20 @@ class Server(Thread): job = Job(job_id, func, args, kwdargs, output, progress, done) with self.job_lock: self.jobs.append(job) - + def run_free_job(self, func, args=[], kwdargs={}): pt = PersistentTemporaryFile('.pickle', '_IPC_') pt.write(cPickle.dumps((func, args, kwdargs))) pt.close() mother.spawn_free_spirit(binascii.hexlify(pt.name)) - + ########################################################################################## ##################################### CLIENT CODE ##################################### ########################################################################################## class BufferedSender(object): - + def __init__(self, socket): self.socket = socket self.wbuf, self.pbuf = [], [] @@ -657,14 +659,14 @@ class BufferedSender(object): self.last_report = None self.timer = RepeatingTimer(0.5, self.send, 'BufferedSender') self.timer.start() - - + + def write(self, msg): if not isinstance(msg, basestring): msg = unicode(msg) with self.wlock: self.wbuf.append(msg) - + def send(self): if callable(select) and select([self.socket], [], [], 0)[0]: msg = read(self.socket) @@ -687,7 +689,7 @@ class BufferedSender(object): write(self.socket, 'OUTPUT:'+msg) read(self.socket, 10) reported = True - + with self.plock: if self.pbuf: msg = cPickle.dumps(self.pbuf, -1) @@ -703,11 +705,11 @@ class BufferedSender(object): write(self.socket, 'PING:') read(self.socket, 10) self.last_report = time.time() - + def notify(self, percent, msg=''): with self.plock: self.pbuf.append((percent, msg)) - + def flush(self): pass @@ -725,13 +727,13 @@ def work(client_socket, func, args, kwdargs): kargs[notification] = sys.stdout.notify kargs.update(kwdargs) res = func(*args, **kargs) - if hasattr(sys.stdout, 'send'): + if hasattr(sys.stdout, 'send'): sys.stdout.send() return res finally: sys.stdout.last_report = None time.sleep(5) # Give any in progress BufferedSend time to complete - + def worker(host, port): client_socket = socket.socket(SOCKET_TYPE, socket.SOCK_STREAM) @@ -742,10 +744,10 @@ def worker(host, port): if msg != 'OK': return 1 write(client_socket, 'WAITING') - + sys.stdout = BufferedSender(client_socket) sys.stderr = sys.stdout - + while True: if not select([client_socket], [], [], 60)[0]: time.sleep(1) @@ -766,7 +768,7 @@ def worker(host, port): break gc.collect() elif msg == 'PING:': - write(client_socket, 'OK') + write(client_socket, 'OK') elif msg == 'STOP:': client_socket.shutdown(socket.SHUT_RDWR) return 0 @@ -775,7 +777,7 @@ def worker(host, port): else: print >>sys.__stderr__, 'Invalid protocols message', msg return 1 - + def free_spirit(path): func, args, kwdargs = cPickle.load(open(path, 'rb')) try: @@ -785,7 +787,7 @@ def free_spirit(path): func, kargs = get_func(func)[:2] kargs.update(kwdargs) func(*args, **kargs) - + def main(args=sys.argv): global isworker isworker = True @@ -793,9 +795,9 @@ def main(args=sys.argv): if len(args) == 1: free_spirit(binascii.unhexlify(re.sub(r'[^a-f0-9A-F]', '', args[0]))) else: - worker(args[0].replace("'", ''), int(args[1]) if iswindows else args[1]) + worker(args[0].replace("'", ''), int(args[1]) if iswindows else args[1]) return 0 if __name__ == '__main__': sys.exit(main()) - + diff --git a/upload.py b/upload.py index 6a9f22807b..79a8c55738 100644 --- a/upload.py +++ b/upload.py @@ -12,7 +12,7 @@ def get_ip_address(ifname): 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) - + HOST=get_ip_address('eth0') PROJECT=os.path.basename(os.getcwd()) @@ -34,7 +34,7 @@ mkdir -p build dist src/calibre/plugins && \ %%s && \ rm -rf build/* && \ %%s %%s -'''%dict(host=HOST, project=PROJECT) +'''%dict(host=HOST, project=PROJECT) check_call = partial(_check_call, shell=True) #h = Host(hostType=VIX_SERVICEPROVIDER_VMWARE_WORKSTATION) @@ -43,7 +43,7 @@ def tag_release(): print 'Tagging release' check_call('bzr tag '+__version__) check_call('bzr commit --unchanged -m "IGN:Tag release"') - + def installer_name(ext): if ext in ('exe', 'dmg'): return 'dist/%s-%s.%s'%(__appname__, __version__, ext) @@ -87,7 +87,7 @@ def build_windows(shutdown=True): def build_osx(shutdown=True): installer = installer_name('dmg') vm = '/vmware/Mac OSX/Mac OSX.vmx' - python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' + python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' start_vm(vm, 'osx', (BUILD_SCRIPT%('sudo %s setup.py develop'%python, python, 'installer/osx/freeze.py')).replace('rm ', 'sudo rm ')) subprocess.check_call(('scp', 'osx:build/%s/dist/*.dmg'%PROJECT, 'dist')) if not os.path.exists(installer): @@ -95,7 +95,7 @@ def build_osx(shutdown=True): if shutdown: subprocess.Popen(('ssh', 'osx', 'sudo', '/sbin/shutdown', '-h', 'now')) return os.path.basename(installer) - + def build_linux(shutdown=True): installer = installer_name('tar.bz2') @@ -146,7 +146,7 @@ def curl_delete_file(path, url=MOBILEREAD): c.setopt(c.QUOTE, ['dele '+ path]) c.perform() c.close() - + def curl_upload_file(stream, url): c = pycurl.Curl() @@ -173,9 +173,9 @@ def curl_upload_file(stream, url): stream.seek(0,2) if size != stream.tell(): raise RuntimeError('curl failed to upload %s correctly'%getattr(stream, 'name', '')) - - - + + + def upload_installer(name): if not os.path.exists(name): return @@ -189,17 +189,19 @@ def upload_installer(name): def upload_installers(): for i in ('dmg', 'exe', 'tar.bz2'): upload_installer(installer_name(i)) - + check_call('''ssh divok echo %s \\> %s/latest_version'''%(__version__, DOWNLOADS)) - - + + def upload_docs(): + os.environ['PYTHONPATH'] = os.path.abspath('src') check_call('''epydoc --config epydoc.conf''') check_call('''scp -r docs/html divok:%s/'''%(DOCS,)) check_call('''epydoc -v --config epydoc-pdf.conf''') check_call('''scp docs/pdf/api.pdf divok:%s/'''%(DOCS,)) def upload_user_manual(): + os.environ['PYTHONPATH'] = os.path.abspath('src') cwd = os.getcwdu() os.chdir('src/calibre/manual') try: @@ -208,25 +210,24 @@ def upload_user_manual(): check_call('scp -r .build/html/* divok:%s'%USER_MANUAL) finally: os.chdir(cwd) - + def build_src_tarball(): check_call('bzr export dist/calibre-%s.tar.bz2'%__version__) - + def upload_src_tarball(): check_call('ssh divok rm -f %s/calibre-\*.tar.bz2'%DOWNLOADS) check_call('scp dist/calibre-*.tar.bz2 divok:%s/'%DOWNLOADS) def stage_one(): - shutil.rmtree('build') + check_call('sudo rm -rf build', shell=True) os.mkdir('build') shutil.rmtree('docs') os.mkdir('docs') - check_call(['python', 'setup.py', 'build']) - check_call('sudo rm -f src/%s/gui2/images_rc.pyc'%__appname__, shell=True) + check_call('python setup.py mydevelop', shell=True) check_call('make', shell=True) tag_release() upload_demo() - + def stage_two(): subprocess.check_call('rm -rf dist/*', shell=True) build_installers() @@ -250,8 +251,8 @@ def main(args=sys.argv): print 'Starting stage three...' stage_three() print 'Finished' - return 0 - - + return 0 + + if __name__ == '__main__': sys.exit(main()) From 487117f48fbd56e68dbe5476cdc0b38314c6d9fc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 15:08:50 -0700 Subject: [PATCH 05/31] Fix regression that disabled comments section in metadata dialog. --- src/calibre/gui2/make.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/make.py b/src/calibre/gui2/make.py index c32136f129..64b957b46b 100644 --- a/src/calibre/gui2/make.py +++ b/src/calibre/gui2/make.py @@ -42,8 +42,10 @@ def build_forms(forms): dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(? Date: Mon, 4 Aug 2008 15:09:53 -0700 Subject: [PATCH 06/31] version 0.4.82 --- src/calibre/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 2d2e8739ae..30ca4d359a 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.81' +__version__ = '0.4.82' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' From 265a6188817fb42763d9a6a552a8271ab292998c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 18:11:59 -0700 Subject: [PATCH 07/31] Fix `calibredb list` on windows --- src/calibre/library/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 2a3e58f99b..d5eea9696e 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -42,7 +42,7 @@ def do_list(db, fields, sort_by, ascending, search_text): widths = list(map(lambda x : 0, fields)) for i in db.data: for j, field in enumerate(fields): - widths[j] = max(widths[j], len(unicode(i[field]))) + widths[j] = max(widths[j], len(unicode(i[str(field)]))) screen_width = terminal_controller.COLS if not screen_width: From 2adea64882f812bf221878680a0ee3a89906805e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 18:45:01 -0700 Subject: [PATCH 08/31] Fix #925 (Bulk convert (2 files) fails with the errors below.) --- src/calibre/gui2/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 32e400dafd..475b20a9c0 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -792,8 +792,9 @@ class Main(MainWindow, Ui_MainWindow): bad_rows = [] self.status_bar.showMessage(_('Starting Bulk conversion of %d books')%len(rows), 2000) - - for i, row in enumerate([r.row() for r in rows]): + if rows and hasattr(rows[0], 'row'): + rows = [r.row() for r in rows] + for i, row in enumerate(rows): cmdline = list(d.cmdline) mi = self.library_view.model().db.get_metadata(row) if mi.title: From 6eb005d5c6e0186cf90431f39c9c172187f1cb4c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Aug 2008 22:15:37 -0700 Subject: [PATCH 09/31] IGN:Working HTML traversal and misc bug fixes --- src/calibre/ebooks/epub/traverse.py | 209 +++++++++++++++------------- src/calibre/gui2/make.py | 2 +- src/calibre/library/cli.py | 2 +- 3 files changed, 114 insertions(+), 99 deletions(-) diff --git a/src/calibre/ebooks/epub/traverse.py b/src/calibre/ebooks/epub/traverse.py index 670e056028..d5d019f376 100644 --- a/src/calibre/ebooks/epub/traverse.py +++ b/src/calibre/ebooks/epub/traverse.py @@ -4,7 +4,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' ''' -Recursively parse HTML files to find all linked files. +Recursively parse HTML files to find all linked files. See :function:`traverse`. ''' import sys, os, re @@ -23,7 +23,7 @@ class Link(object): path = url.path if os.path.isabs(path): return path - return os.path.abspath(os.path.join(base, url)) + return os.path.abspath(os.path.join(base, path)) def __init__(self, url, base): ''' @@ -32,12 +32,13 @@ class Link(object): Must be a unicode string. ''' assert isinstance(url, unicode) and isinstance(base, unicode) - self.url = url - self.parsed_url = urlparse(unquote(self.url)) - self.is_local = self.parsed_url.scheme in ('', 'file') - self.path = None - self.fragment = self.parsed_url.fragment - if self.is_local: + self.url = url + self.parsed_url = urlparse(unquote(self.url)) + self.is_local = self.parsed_url.scheme in ('', 'file') + self.is_internal = self.is_local and not bool(self.parsed_url.path) + self.path = None + self.fragment = self.parsed_url.fragment + if self.is_local and not self.is_internal: self.path = self.url_to_local_path(self.parsed_url, base) def __hash__(self): @@ -46,89 +47,77 @@ class Link(object): return hash(self.path) def __eq__(self, other): - if not (hasattr(other, 'url') and hasattr(other, 'path')): - return False - if self.path is None: - return self.url == other.url - return self.path == other.path + return self.path == getattr(other, 'path', other) + + def __str__(self): + return u'Link: %s --> %s'%(self.url, self.path) class IgnoreFile(Exception): - pass + + def __init__(self, msg, errno): + Exception.__init__(self, msg) + self.doesnt_exist = errno == 2 + self.errno = errno class HTMLFile(object): ''' - Contains basic traversal information about an HTML file. This - includes a recursive list of links to other files as well as - the encoding of each file. - - You can iterate over the tree of files rooted at this file - by calling either :method:`breadth_first` or :method:`depth_first`. + Contains basic information about an HTML file. This + includes a list of links to other files as well as + the encoding of each file. Also tries to detect if the file is not a HTML + file in which case :member:`is_binary` is set to True. The encoding of the file is available as :member:`encoding`. - - If the file is a binary file (i.e. if conversion to unicode fails) - :member:`is_binary` is set to `True`. ''' - + + HTML_PAT = re.compile(r'<\s*html', re.IGNORECASE) LINK_PAT = re.compile( r'<\s*a\s+.*?href\s*=\s*(?:(?:"(?P[^"]+)")|(?:\'(?P[^\']+)\')|(?P[^\s]+))', re.DOTALL|re.IGNORECASE) - def __init__(self, path_to_html_file, level, max_levels=sys.maxint, - encoding=None, verbose=0): + def __init__(self, path_to_html_file, level, encoding, verbose): ''' :param level: The level of this file. Should be 0 for the root file. - :param max_levels: `level >= max_levels` the links in this file - will not be followed. :param encoding: Use `encoding` to decode HTML. ''' self.path = unicode_path(path_to_html_file, abs=True) self.base = os.path.dirname(self.path) self.level = level self.links = [] - self.map = {} - self.is_binary = False + try: with open(self.path, 'rb') as f: src = f.read() except IOError, err: - msg = 'Could not read from file: %s with error: %s'% - (self.path, unicode(err)) + msg = 'Could not read from file: %s with error: %s'%(self.path, unicode(err)) if level == 0: raise IOError(msg) - if verbose: - print msg - raise IgnoreFile - if encoding is None: - encoding = xml_to_unicode(src[:4096], verbose=verbose)[-1] - self.encoding = encoding + raise IgnoreFile(msg, err.errno) + + self.is_binary = not bool(self.HTML_PAT.search(src[:1024])) + + if not self.is_binary: + if encoding is None: + encoding = xml_to_unicode(src[:4096], verbose=verbose)[-1] + self.encoding = encoding - - try: src = src.decode(encoding, 'replace') - except UnicodeDecodeError: - self.is_binary = True - if verbose > 1: - print self.path, 'is a binary file.' - else: self.find_links(src) + - if self.level < max_levels: - rejects = [] - for link in self.links: - if link.path is not None: - try: - self.map[link.url] = HTMLFile(link.path, level+1, - max_levels, encoding=encoding, verbose=verbose) - except IgnoreFile: - rejects.append(link) - for link in rejects: - self.links.remove(link) + + def __eq__(self, other): + return self.path == getattr(other, 'path', other) + + def __str__(self): + return u'HTMLFile:%d:%s:%s'%(self.level, 'b' if self.is_binary else 'a', self.path) + + def __repr__(self): + return str(self) def find_links(self, src): - for match in self.LINK_PAT.finditer(): + for match in self.LINK_PAT.finditer(src): url = None for i in ('url1', 'url2', 'url3'): url = match.group(i) @@ -138,47 +127,73 @@ class HTMLFile(object): if link not in self.links: self.links.append(link) - def breadth_first(self, root=True): - ''' - Walk over the tree of linked files (by `` links) breadth - first. - :param root: If `True` return `self` as the first file. - :return: A breadth-first iterator. - ''' - if root: - yield self - for link in self.links: - if link.path is not None: - yield self.map[link.url] - - for link in self.links: - if link.path is not None: - for hf in self.map[link.url].breadth_first(root=False): - yield hf - - def depth_first(self, root=True): - ''' - Walk over the tree of linked files (by `` links) depth - first. - - :param root: If `True` return `self` as the first file. - :return: A depth-first iterator. - ''' - if root: - yield self - for link in self.links: - if link.path is not None: - yield self.map[link.url] - for hf in self.map[link.url].depth_first(root=False): - yield hf +def depth_first(root, flat, visited=set([])): + yield root + visited.add(root) + for link in root.links: + if link.path is not None and link not in visited: + try: + index = flat.index(link) + except ValueError: # Can happen if max_levels is used + continue + hf = flat[index] + if hf not in visited: + yield hf + visited.add(hf) + for hf in depth_first(hf, flat, visited): + if hf not in visited: + yield hf + visited.add(hf) + + +def traverse(path_to_html_file, max_levels=sys.maxint, verbose=0, encoding=None): + ''' + Recursively traverse all links in the HTML file. + :param max_levels: Maximum levels of recursion. Must be non-negative. 0 + implies that no links in hte root HTML file are followed. + :param encoding: Specify character encoding of HTML files. If `None` it is + auto-detected. + :return: A pair of lists (breadth_first, depth_first). Each list contains + :class:`HTMLFile` objects. + ''' + assert max_levels >= 0 + level = 0 + flat = [HTMLFile(path_to_html_file, level, encoding, verbose)] + next_level = list(flat) + while level < max_levels and len(next_level) > 0: + level += 1 + nl = [] + for hf in next_level: + rejects = [] + for link in hf.links: + if link.path is None or link.path in flat: + continue + try: + nf = HTMLFile(link.path, level, encoding, verbose) + nl.append(nf) + flat.append(nf) + except IgnoreFile, err: + rejects.append(link) + if not err.doesnt_exist or verbose > 1: + print str(err) + for link in rejects: + hf.links.remove(link) + + next_level = list(nl) + + return flat, list(depth_first(flat[0], flat)) + + + + + + if __name__ == '__main__': - root = HTMLFile(sys.argv[1], 0, verbose=2) - print 'Depth first...' - for f in root.depth_first(): - print f.path - print '\n\nBreadth first...' - for f in root.breadth_first(): - print f.path + breadth_first, depth_first = traverse(sys.argv[1], verbose=2) + print 'Breadth first...' + for f in breadth_first: print f + print '\n\nDepth first...' + for f in depth_first: print f diff --git a/src/calibre/gui2/make.py b/src/calibre/gui2/make.py index 64b957b46b..fea040ca71 100644 --- a/src/calibre/gui2/make.py +++ b/src/calibre/gui2/make.py @@ -42,7 +42,7 @@ def build_forms(forms): dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(? Date: Tue, 5 Aug 2008 07:57:45 -0700 Subject: [PATCH 10/31] Fix #924 (CBZ Convert Error) --- src/calibre/utils/zipfile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index 02f7eac5c4..ff31210444 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -1028,11 +1028,13 @@ class ZipFile: # Create all upper directories if necessary. upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.isdir(upperdirs): + os.unlink(upperdirs) if upperdirs and not os.path.exists(upperdirs): os.makedirs(upperdirs) - + source = self.open(member, pwd=pwd) - target = file(targetpath, "wb") + target = open(targetpath, "wb") shutil.copyfileobj(source, target) source.close() target.close() From 98725dd828f054e45378b194a476a5803afd6d97 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Aug 2008 14:04:44 -0700 Subject: [PATCH 11/31] Fixes for handling of unicode command line arguments on windows --- src/calibre/__init__.py | 3 ++- src/calibre/ebooks/lrf/lit/convert_from.py | 7 ++++--- src/calibre/ebooks/lrf/pdf/convert_from.py | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 30ca4d359a..79467dd5b4 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -76,7 +76,8 @@ if iswindows: winutil, winutilerror = plugins['winutil'] if not winutil: raise RuntimeError('Failed to load the winutil plugin: %s'%winutilerror) - sys.argv[1:] = winutil.argv()[1:] + if len(sys.argv) > 1: + sys.argv[1:] = winutil.argv()[1-len(sys.argv):] win32event = __import__('win32event') winerror = __import__('winerror') win32api = __import__('win32api') diff --git a/src/calibre/ebooks/lrf/lit/convert_from.py b/src/calibre/ebooks/lrf/lit/convert_from.py index c9c9c2ee96..987fd97354 100644 --- a/src/calibre/ebooks/lrf/lit/convert_from.py +++ b/src/calibre/ebooks/lrf/lit/convert_from.py @@ -31,13 +31,15 @@ _('''Usage: %prog [options] mybook.lit def generate_html2(pathtolit, logger): if not os.access(pathtolit, os.R_OK): raise ConversionError, 'Cannot read from ' + pathtolit - tdir = mkdtemp(prefix=__appname__+'_') + tdir = mkdtemp(prefix=__appname__+'_'+'lit2oeb_') lr = LitReader(pathtolit) print 'Extracting LIT file to', tdir lr.extract_content(tdir) return tdir def generate_html(pathtolit, logger): + if isinstance(pathtolit, unicode): + pathtolit = pathtolit.encode(sys.getfilesystemencoding()) if not os.access(pathtolit, os.R_OK): raise ConversionError, 'Cannot read from ' + pathtolit tdir = mkdtemp(prefix=__appname__+'_') @@ -96,7 +98,6 @@ def process_file(path, options, logger=None): options.output = os.path.abspath(os.path.basename(os.path.splitext(path)[0]) + ext) options.output = os.path.abspath(os.path.expanduser(options.output)) options.use_spine = True - html_process_file(htmlfile, options, logger=logger) finally: try: @@ -108,7 +109,7 @@ def process_file(path, options, logger=None): def main(args=sys.argv, logger=None): parser = option_parser() options, args = parser.parse_args(args) - if len(args) != 2: + if len(args) != 2: parser.print_help() print print 'No lit file specified' diff --git a/src/calibre/ebooks/lrf/pdf/convert_from.py b/src/calibre/ebooks/lrf/pdf/convert_from.py index 078359e9c3..1d1260de2c 100644 --- a/src/calibre/ebooks/lrf/pdf/convert_from.py +++ b/src/calibre/ebooks/lrf/pdf/convert_from.py @@ -25,6 +25,8 @@ def generate_html(pathtopdf, logger): Convert the pdf into html. @return: Path to a temporary file containing the HTML. ''' + if isinstance(pathtopdf, unicode): + pathtopdf = pathtopdf.encode(sys.getfilesystemencoding()) if not os.access(pathtopdf, os.R_OK): raise ConversionError, 'Cannot read from ' + pathtopdf tdir = PersistentTemporaryDirectory('pdftohtml') From ab00d25925db6fdbae2890122ddea950fada8e84 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Aug 2008 14:08:21 -0700 Subject: [PATCH 12/31] IGN:Use distutils to build PyQt extensions --- pyqtdistutils.py | 195 +++++++++++++++++ setup.py | 207 +++++++----------- .../gui2/pictureflow/PyQt/configure.py | 52 ----- .../pictureflow/{PyQt => }/pictureflow.sip | 4 +- src/calibre/utils/windows/winutil.c | 2 +- upload.py | 10 +- 6 files changed, 278 insertions(+), 192 deletions(-) create mode 100644 pyqtdistutils.py delete mode 100644 src/calibre/gui2/pictureflow/PyQt/configure.py rename src/calibre/gui2/pictureflow/{PyQt => }/pictureflow.sip (95%) diff --git a/pyqtdistutils.py b/pyqtdistutils.py new file mode 100644 index 0000000000..9c225dcf20 --- /dev/null +++ b/pyqtdistutils.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Build PyQt extensions. Integrates with distutils (but uses the PyQt build system). +''' +from distutils.core import Extension +from distutils.command.build_ext import build_ext as _build_ext +from distutils.dep_util import newer_group +from distutils import log + +import sipconfig, os, sys, string, glob, shutil +from PyQt4 import pyqtconfig +iswindows = 'win32' in sys.platform +WINDOWS_PYTHON = ['C:/Python25/libs'] +OSX_SDK = 'TODO:' + +def replace_suffix(path, new_suffix): + return os.path.splitext(path)[0] + new_suffix + +class PyQtExtension(Extension): + + def __init__(self, name, sources, sip_sources, **kw): + ''' + :param sources: Qt .cpp and .h files needed for this extension + :param sip_sources: List of .sip files this extension depends on. The + first .sip file will be used toactually build the extension. + ''' + self.module_makefile = pyqtconfig.QtGuiModuleMakefile + self.sip_sources = map(lambda x: x.replace('/', os.sep), sip_sources) + Extension.__init__(self, name, sources, **kw) + + +class build_ext(_build_ext): + + def make(self, makefile): + make = 'make' + if iswindows: + make = 'mingw32-make' + self.spawn([make, '-f', makefile]) + + def build_qt_objects(self, ext, bdir): + if not iswindows: + bdir = os.path.join(bdir, 'qt') + if not os.path.exists(bdir): + os.makedirs(bdir) + cwd = os.getcwd() + sources = map(os.path.abspath, ext.sources) + os.chdir(bdir) + try: + headers = set([f for f in sources if f.endswith('.h')]) + sources = set(sources) - headers + name = ext.name.rpartition('.')[-1] + pro = '''\ +TARGET = %s +TEMPLATE = lib +HEADERS = %s +SOURCES = %s +VERSION = 1.0.0 +CONFIG += x86 ppc +'''%(name, ' '.join(headers), ' '.join(sources)) + open(name+'.pro', 'wb').write(pro) + self.spawn(['qmake', '-o', 'Makefile.qt', name+'.pro']) + self.make('Makefile.qt') + pat = 'release\\*.o' if iswindows else '*.o' + return glob.glob(pat) + finally: + os.chdir(cwd) + + def build_sbf(self, sip, sbf, bdir): + sip_bin = self.sipcfg.sip_bin + self.spawn([sip_bin, + "-c", bdir, + "-b", sbf, + '-I', self.pyqtcfg.pyqt_sip_dir, + ] + self.pyqtcfg.pyqt_sip_flags.split()+ + [sip]) + + def build_pyqt(self, bdir, sbf, ext, qtobjs, headers): + makefile = ext.module_makefile(configuration=self.pyqtcfg, + build_file=sbf, dir=bdir, + makefile='Makefile.pyqt', + universal=OSX_SDK, qt=1) + if 'win32' in sys.platform: + makefile.extra_lib_dirs += WINDOWS_PYTHON + makefile.extra_include_dirs = list(set(map(os.path.dirname, headers))) + makefile.extra_lflags += qtobjs + makefile.generate() + cwd = os.getcwd() + os.chdir(bdir) + try: + self.make('Makefile.pyqt') + finally: + os.chdir(cwd) + + + + def build_extension(self, ext): + self.inplace = True + if not isinstance(ext, PyQtExtension): + return _build_ext.build_extension(self, ext) + + fullname = self.get_ext_fullname(ext.name) + if self.inplace: + # ignore build-lib -- put the compiled extension into + # the source tree along with pure Python modules + + modpath = string.split(fullname, '.') + package = string.join(modpath[0:-1], '.') + base = modpath[-1] + + build_py = self.get_finalized_command('build_py') + package_dir = build_py.get_package_dir(package) + ext_filename = os.path.join(package_dir, + self.get_ext_filename(base)) + else: + ext_filename = os.path.join(self.build_lib, + self.get_ext_filename(fullname)) + bdir = os.path.abspath(os.path.join(self.build_temp, fullname)) + if not os.path.exists(bdir): + os.makedirs(bdir) + ext.sources = map(os.path.abspath, ext.sources) + qt_dir = 'qt\\release' if iswindows else 'qt' + objects = set(map(lambda x: os.path.join(bdir, qt_dir, replace_suffix(os.path.basename(x), '.o')), + [s for s in ext.sources if not s.endswith('.h')])) + newer = False + for object in objects: + if newer_group(ext.sources, object, missing='newer'): + newer = True + break + headers = [f for f in ext.sources if f.endswith('.h')] + if self.force or newer: + log.info('building \'%s\' extension', ext.name) + objects = self.build_qt_objects(ext, bdir) + + self.sipcfg = sipconfig.Configuration() + self.pyqtcfg = pyqtconfig.Configuration() + sbf_sources = [] + for sip in ext.sip_sources: + sipbasename = os.path.basename(sip) + sbf = os.path.join(bdir, replace_suffix(sipbasename, ".sbf")) + sbf_sources.append(sbf) + if self.force or newer_group(ext.sip_sources, sbf, 'newer'): + self.build_sbf(sip, sbf, bdir) + generated_sources = [] + for sbf in sbf_sources: + generated_sources += self.get_sip_output_list(sbf, bdir) + + depends = generated_sources + list(objects) + mod = os.path.join(bdir, os.path.basename(ext_filename)) + + if self.force or newer_group(depends, mod, 'newer'): + self.build_pyqt(bdir, sbf_sources[0], ext, list(objects), headers) + + if self.force or newer_group([mod], ext_filename, 'newer'): + if os.path.exists(ext_filename): + os.unlink(ext_filename) + shutil.copyfile(mod, ext_filename) + shutil.copymode(mod, ext_filename) + + def get_sip_output_list(self, sbf, bdir): + """ + Parse the sbf file specified to extract the name of the generated source + files. Make them absolute assuming they reside in the temp directory. + """ + for L in file(sbf): + key, value = L.split("=", 1) + if key.strip() == "sources": + out = [] + for o in value.split(): + out.append(os.path.join(bdir, o)) + return out + + raise RuntimeError, "cannot parse SIP-generated '%s'" % sbf + + def run_sip(self, sip_files): + sip_bin = self.sipcfg.sip_bin + sip_sources = [i[0] for i in sip_files] + generated_sources = [] + for sip, sbf in sip_files: + if not (self.force or newer_group(sip_sources, sbf, 'newer')): + log.info(sbf + ' is up to date') + continue + self.spawn([sip_bin, + "-c", self.build_temp, + "-b", sbf, + '-I', self.pyqtcfg.pyqt_sip_dir, + ] + self.pyqtcfg.pyqt_sip_flags.split()+ + [sip]) + generated_sources += self.get_sip_output_list(sbf) + return generated_sources + + \ No newline at end of file diff --git a/setup.py b/setup.py index 4a2ed4f372..d3be969886 100644 --- a/setup.py +++ b/setup.py @@ -47,141 +47,86 @@ main_functions = { if __name__ == '__main__': from setuptools import setup, find_packages, Extension + from pyqtdistutils import PyQtExtension, build_ext import subprocess, glob - if 'mydevelop' in sys.argv: - LAUNCHER = '''\ -#!%(exe)s -import sys -sys.path.insert(0, %(ppath)s) -sys.argv[0] = %(basename)s -from %(module)s import %(func)s -%(func)s() + + entry_points['console_scripts'].append('calibre_postinstall = calibre.linux:post_install') + ext_modules = [ + Extension('calibre.plugins.lzx', + sources=['src/calibre/utils/lzx/lzxmodule.c', + 'src/calibre/utils/lzx/lzxd.c'], + include_dirs=['src/calibre/utils/lzx']), + Extension('calibre.plugins.msdes', + sources=['src/calibre/utils/msdes/msdesmodule.c', + 'src/calibre/utils/msdes/des.c'], + include_dirs=['src/calibre/utils/msdes']), + PyQtExtension('calibre.plugins.pictureflow', + ['src/calibre/gui2/pictureflow/pictureflow.cpp', + 'src/calibre/gui2/pictureflow/pictureflow.h'], + ['src/calibre/gui2/pictureflow/pictureflow.sip'] + ) + ] + if iswindows: + ext_modules.append(Extension('calibre.plugins.winutil', + sources=['src/calibre/utils/windows/winutil.c'], + libraries=['shell32', 'setupapi'], + include_dirs=['C:/WinDDK/6001.18001/inc/api/']) + ) + if isosx: + ext_modules.append(Extension('calibre.plugins.usbobserver', + sources=['src/calibre/devices/usbobserver/usbobserver.c']) + ) + + setup( + name=APPNAME, + packages = find_packages('src'), + package_dir = { '' : 'src' }, + version=VERSION, + author='Kovid Goyal', + author_email='kovid@kovidgoyal.net', + url = 'http://%s.kovidgoyal.net'%APPNAME, + package_data = {'calibre':['plugins/*']}, + include_package_data=True, + entry_points = entry_points, + zip_safe = False, + options = { 'bdist_egg' : {'exclude_source_files': True,}, }, + ext_modules=ext_modules, + description = + ''' + E-book management application. + ''', + long_description = + ''' + %s is an e-book library manager. It can view, convert and catalog e-books in most of the major e-book formats. It can also talk to a few e-book reader devices. It can go out to the internet and fetch metadata for your books. It can download newspapers and convert them into e-books for convenient reading. It is cross platform, running on Linux, Windows and OS X. - ''' - bindir = os.path.expanduser('~/bin') - def create_launcher(basename, module, func): - args = dict(exe=os.path.realpath(sys.executable), - ppath=repr(os.path.abspath('src')), - basename=repr(basename), - module=module, - func=func) - script = LAUNCHER%args - p = os.path.join(bindir, basename) - open(p, 'wb').write(script) - subprocess.check_call('chmod +x '+p, shell=True) - for x in ('console', 'gui'): - for i in range(len(basenames[x])): - create_launcher(basenames[x][i], main_modules[x][i], main_functions[x][i]) - create_launcher('calibre_postinstall', 'calibre.linux', 'post_install') - subprocess.check_call('python setup.py build', shell=True) - subprocess.check_call('sudo %s/calibre_postinstall'%bindir, shell=True) - else: + For screenshots: https://%s.kovidgoyal.net/wiki/Screenshots - entry_points['console_scripts'].append('calibre_postinstall = calibre.linux:post_install') - ext_modules = [Extension('calibre.plugins.lzx', - sources=['src/calibre/utils/lzx/lzxmodule.c', - 'src/calibre/utils/lzx/lzxd.c'], - include_dirs=['src/calibre/utils/lzx']), - Extension('calibre.plugins.msdes', - sources=['src/calibre/utils/msdes/msdesmodule.c', - 'src/calibre/utils/msdes/des.c'], - include_dirs=['src/calibre/utils/msdes'])] - if iswindows: - ext_modules.append(Extension('calibre.plugins.winutil', - sources=['src/calibre/utils/windows/winutil.c'], - libraries=['shell32', 'setupapi'], - include_dirs=['C:/WinDDK/6001.18001/inc/api/']) - ) - if isosx: - ext_modules.append(Extension('calibre.plugins.usbobserver', - sources=['src/calibre/devices/usbobserver/usbobserver.c']) - ) + For installation/usage instructions please see + http://%s.kovidgoyal.net - def build_PyQt_extension(path): - pro = glob.glob(os.path.join(path, '*.pro'))[0] - raw = open(pro).read() - base = qtplugin = re.search(r'TARGET\s*=\s*(.*)', raw).group(1) - ver = re.search(r'VERSION\s*=\s*(\d+)', raw).group(1) - cwd = os.getcwd() - os.chdir(os.path.dirname(pro)) - try: - if not os.path.exists('.build'): - os.mkdir('.build') - os.chdir('.build') - subprocess.check_call(( (os.path.expanduser('~/qt/bin/qmake') if isosx else 'qmake'), '..'+os.sep+os.path.basename(pro))) - subprocess.check_call(['mingw32-make' if iswindows else 'make']) - os.chdir(os.path.join('..', 'PyQt')) - if not os.path.exists('.build'): - os.mkdir('.build') - os.chdir('.build') - python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' if isosx else 'python' - subprocess.check_call([python, '..'+os.sep+'configure.py']) - subprocess.check_call(['mingw32-make' if iswindows else 'make']) - ext = '.pyd' if iswindows else '.so' - plugin = glob.glob(base+ext)[0] - shutil.copyfile(plugin, os.path.join(cwd, 'src', 'calibre', 'plugins', plugin)) - finally: - os.chdir(cwd) - if islinux or isosx: - for f in glob.glob(os.path.join('src', 'calibre', 'plugins', '*')): - try: - os.readlink(f) - os.unlink(f) - except: - continue + For source code access: + bzr branch http://bzr.kovidgoyal.net/code/%s/trunk %s - for path in [(os.path.join('src', 'calibre', 'gui2', 'pictureflow'))]: - build_PyQt_extension(path) + To update your copy of the source code: + bzr merge - setup( - name=APPNAME, - packages = find_packages('src'), - package_dir = { '' : 'src' }, - version=VERSION, - author='Kovid Goyal', - author_email='kovid@kovidgoyal.net', - url = 'http://%s.kovidgoyal.net'%APPNAME, - package_data = {'calibre':['plugins/*']}, - include_package_data=True, - entry_points = entry_points, - zip_safe = False, - options = { 'bdist_egg' : {'exclude_source_files': True,}, }, - ext_modules=ext_modules, - description = - ''' - E-book management application. - ''', - long_description = - ''' - %s is an e-book library manager. It can view, convert and catalog e-books in most of the major e-book formats. It can also talk to a few e-book reader devices. It can go out to the internet and fetch metadata for your books. It can download newspapers and convert them into e-books for convenient reading. It is cross platform, running on Linux, Windows and OS X. + '''%(APPNAME, APPNAME, APPNAME, APPNAME, APPNAME), + license = 'GPL', + classifiers = [ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: X11 Applications :: Qt', + 'Intended Audience :: Developers', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: GNU General Public License (GPL)', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Hardware :: Hardware Drivers' + ], + cmdclass = {'build_ext': build_ext}, + ) - For screenshots: https://%s.kovidgoyal.net/wiki/Screenshots - - For installation/usage instructions please see - http://%s.kovidgoyal.net - - For source code access: - bzr branch http://bzr.kovidgoyal.net/code/%s/trunk %s - - To update your copy of the source code: - bzr merge - - '''%(APPNAME, APPNAME, APPNAME, APPNAME, APPNAME), - license = 'GPL', - classifiers = [ - 'Development Status :: 4 - Beta', - 'Environment :: Console', - 'Environment :: X11 Applications :: Qt', - 'Intended Audience :: Developers', - 'Intended Audience :: End Users/Desktop', - 'License :: OSI Approved :: GNU General Public License (GPL)', - 'Natural Language :: English', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Topic :: System :: Hardware :: Hardware Drivers' - ] - ) - - if 'develop' in ' '.join(sys.argv) and islinux: - subprocess.check_call('calibre_postinstall', shell=True) + if 'develop' in ' '.join(sys.argv) and islinux: + subprocess.check_call('calibre_postinstall', shell=True) diff --git a/src/calibre/gui2/pictureflow/PyQt/configure.py b/src/calibre/gui2/pictureflow/PyQt/configure.py deleted file mode 100644 index deb2d51832..0000000000 --- a/src/calibre/gui2/pictureflow/PyQt/configure.py +++ /dev/null @@ -1,52 +0,0 @@ -import os, sys, glob -if os.environ.get('PYQT4PATH', None): - print os.environ['PYQT4PATH'] - sys.path.insert(0, os.environ['PYQT4PATH']) -from PyQt4 import pyqtconfig - -# The name of the SIP build file generated by SIP and used by the build -# system. -build_file = "pictureflow.sbf" - -# Get the PyQt configuration information. -config = pyqtconfig.Configuration() - -# Run SIP to generate the code. Note that we tell SIP where to find the qt -# module's specification files using the -I flag. -sip = [config.sip_bin, "-c", ".", "-b", build_file, "-I", - config.pyqt_sip_dir, config.pyqt_sip_flags, "../pictureflow.sip"] -os.system(" ".join(sip)) - - - -installs=[] - -# Create the Makefile. The QtModuleMakefile class provided by the -# pyqtconfig module takes care of all the extra preprocessor, compiler and -# linker flags needed by the Qt library. -makefile = pyqtconfig.QtGuiModuleMakefile ( - configuration=config, - build_file=build_file, - installs=installs, - qt=1, -) - -# Setup the platform dependent Makefile parameters -d = os.path.dirname -if 'darwin' in sys.platform: - makefile.extra_cflags += ['-arch i386', '-arch ppc'] - makefile.extra_lflags += ['-arch i386', '-arch ppc'] -qtdir = os.path.join(d(d(os.getcwd())), '.build') -if 'win32' in sys.platform: - qtdir = os.path.join(qtdir, 'release') - makefile.extra_lib_dirs += ['C:/Python25/libs'] - -# Add the compiled Qt objects -qtobjs = map(lambda x:'"'+x+'"', glob.glob(os.path.join(qtdir, '*.o'))) -makefile.extra_lflags += qtobjs -makefile.extra_cxxflags = makefile.extra_cflags - -# Generate the Makefile itself. -makefile.generate() - - diff --git a/src/calibre/gui2/pictureflow/PyQt/pictureflow.sip b/src/calibre/gui2/pictureflow/pictureflow.sip similarity index 95% rename from src/calibre/gui2/pictureflow/PyQt/pictureflow.sip rename to src/calibre/gui2/pictureflow/pictureflow.sip index 4dc7e059d5..c636529e05 100644 --- a/src/calibre/gui2/pictureflow/PyQt/pictureflow.sip +++ b/src/calibre/gui2/pictureflow/pictureflow.sip @@ -9,7 +9,7 @@ class FlowImages : QObject { %TypeHeaderCode -#include "../../pictureflow.h" +#include %End public: @@ -22,7 +22,7 @@ public: class PictureFlow : QWidget { %TypeHeaderCode -#include "../../pictureflow.h" +#include %End diff --git a/src/calibre/utils/windows/winutil.c b/src/calibre/utils/windows/winutil.c index 69672efb8a..3be91cdb93 100644 --- a/src/calibre/utils/windows/winutil.c +++ b/src/calibre/utils/windows/winutil.c @@ -49,7 +49,7 @@ wherever possible in this module. Get command line arguments as unicode objects. Note that the first argument will be the path to the interpreter, *not* the script being run. So to replace sys.argv, you should use - sys.argv[1:] = winutil.argv()[1:]. + `if len(sys.argv) > 1: sys.argv[1:] = winutil.argv()[1-len(sys.argv):]` */ diff --git a/upload.py b/upload.py index 79a8c55738..f6df21b484 100644 --- a/upload.py +++ b/upload.py @@ -28,9 +28,8 @@ MOBILEREAD = 'ftp://dev.mobileread.com/calibre/' BUILD_SCRIPT ='''\ #!/bin/bash cd ~/build && \ -rsync -avz --exclude src/calibre/plugins --exclude docs --exclude .bzr --exclude .build --exclude build --exclude dist --exclude "*.pyc" --exclude "*.pyo" rsync://%(host)s/work/%(project)s . && \ -cd %(project)s && rm -rf build dist src/calibre/plugins && \ -mkdir -p build dist src/calibre/plugins && \ +rsync -avz --exclude src/calibre/plugins --exclude calibre/src/calibre.egg-info --exclude docs --exclude .bzr --exclude .build --exclude build --exclude dist --exclude "*.pyc" --exclude "*.pyo" rsync://%(host)s/work/%(project)s . && \ +cd %(project)s && \ %%s && \ rm -rf build/* && \ %%s %%s @@ -194,14 +193,12 @@ def upload_installers(): def upload_docs(): - os.environ['PYTHONPATH'] = os.path.abspath('src') check_call('''epydoc --config epydoc.conf''') check_call('''scp -r docs/html divok:%s/'''%(DOCS,)) check_call('''epydoc -v --config epydoc-pdf.conf''') check_call('''scp docs/pdf/api.pdf divok:%s/'''%(DOCS,)) def upload_user_manual(): - os.environ['PYTHONPATH'] = os.path.abspath('src') cwd = os.getcwdu() os.chdir('src/calibre/manual') try: @@ -223,7 +220,8 @@ def stage_one(): os.mkdir('build') shutil.rmtree('docs') os.mkdir('docs') - check_call('python setup.py mydevelop', shell=True) + subprocess.call('python setup.py develop', shell=True) + check_call('sudo python setup.py develop', shell=True) check_call('make', shell=True) tag_release() upload_demo() From f5bcc609b3ef86aad51366c90b7a021238948e40 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Aug 2008 14:09:33 -0700 Subject: [PATCH 13/31] IGN:... --- src/calibre/gui2/pictureflow/pictureflow.pro | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 src/calibre/gui2/pictureflow/pictureflow.pro diff --git a/src/calibre/gui2/pictureflow/pictureflow.pro b/src/calibre/gui2/pictureflow/pictureflow.pro deleted file mode 100644 index a299ab9ce1..0000000000 --- a/src/calibre/gui2/pictureflow/pictureflow.pro +++ /dev/null @@ -1,6 +0,0 @@ -TARGET = pictureflow -TEMPLATE = lib -HEADERS = pictureflow.h -SOURCES = pictureflow.cpp -VERSION = 1.0.0 -CONFIG += x86 ppc From 4dff7ecf95f0fa2ab160fa1831cfbfb776996759 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Aug 2008 22:33:19 -0700 Subject: [PATCH 14/31] Switch to using lit2oeb to explode LIT files. --- installer/linux/freeze.py | 3 +- installer/osx/freeze.py | 6 ---- installer/windows/freeze.py | 3 -- pyqtdistutils.py | 2 +- src/calibre/ebooks/lrf/lit/convert_from.py | 38 ++-------------------- src/calibre/trac/plugins/download.py | 6 +--- upload.py | 2 +- 7 files changed, 7 insertions(+), 53 deletions(-) diff --git a/installer/linux/freeze.py b/installer/linux/freeze.py index f33b059903..f32286092a 100644 --- a/installer/linux/freeze.py +++ b/installer/linux/freeze.py @@ -10,7 +10,6 @@ import glob, sys, subprocess, tarfile, os, re, py_compile, shutil HOME = '/home/kovid' PYINSTALLER = os.path.expanduser('~/build/pyinstaller') CALIBREPREFIX = '___' -CLIT = '/usr/bin/clit' PDFTOHTML = '/usr/bin/pdftohtml' LIBUNRAR = '/usr/lib/libunrar.so' QTDIR = '/usr/lib/qt4' @@ -117,7 +116,7 @@ for f in glob.glob(os.path.join(CALIBREPLUGINS, '*.so.*')): binaries += [(os.path.basename(f), f, 'BINARY')] print 'Adding external programs...' -binaries += [('clit', CLIT, 'BINARY'), ('pdftohtml', PDFTOHTML, 'BINARY'), +binaries += [('pdftohtml', PDFTOHTML, 'BINARY'), ('libunrar.so', LIBUNRAR, 'BINARY')] print 'Adding external libraries...' diff --git a/installer/osx/freeze.py b/installer/osx/freeze.py index 30fd2647a2..a57b3ce375 100644 --- a/installer/osx/freeze.py +++ b/installer/osx/freeze.py @@ -244,12 +244,6 @@ _check_symlinks_prescript() print - print 'Adding clit' - os.link(os.path.expanduser('~/clit'), os.path.join(frameworks_dir, 'clit')) - print - print 'Adding unrtf' - os.link(os.path.expanduser('~/unrtf'), os.path.join(frameworks_dir, 'unrtf')) - print print 'Adding pdftohtml' os.link(os.path.expanduser('~/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml')) print 'Adding plugins' diff --git a/installer/windows/freeze.py b/installer/windows/freeze.py index 8d7f53228e..63de45ebc2 100644 --- a/installer/windows/freeze.py +++ b/installer/windows/freeze.py @@ -10,7 +10,6 @@ QT_DIR = 'C:\\Qt\\4.4.0' DEVCON = 'C:\\devcon\\i386\\devcon.exe' LIBUSB_DIR = 'C:\\libusb' LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll' -CLIT = 'C:\\clit\\clit.exe' PDFTOHTML = 'C:\\pdftohtml\\pdftohtml.exe' IMAGEMAGICK_DIR = 'C:\\ImageMagick' FONTCONFIG_DIR = 'C:\\fontconfig' @@ -105,8 +104,6 @@ class BuildEXE(py2exe.build_exe.py2exe): shutil.copyfile(DEVCON, os.path.join(tdir, os.path.basename(DEVCON))) print '\tAdding unrar' shutil.copyfile(LIBUNRAR, os.path.join(PY2EXE_DIR, os.path.basename(LIBUNRAR))) - print '\tAdding ConvertLIT' - shutil.copyfile(CLIT, os.path.join(PY2EXE_DIR, os.path.basename(CLIT))) print '\tAdding pdftohtml' shutil.copyfile(PDFTOHTML, os.path.join(PY2EXE_DIR, os.path.basename(PDFTOHTML))) print '\tAdding ImageMagick' diff --git a/pyqtdistutils.py b/pyqtdistutils.py index 9c225dcf20..f80486e314 100644 --- a/pyqtdistutils.py +++ b/pyqtdistutils.py @@ -98,7 +98,7 @@ CONFIG += x86 ppc def build_extension(self, ext): - self.inplace = True + self.inplace = True # Causes extensions to be built in the source tree if not isinstance(ext, PyQtExtension): return _build_ext.build_extension(self, ext) diff --git a/src/calibre/ebooks/lrf/lit/convert_from.py b/src/calibre/ebooks/lrf/lit/convert_from.py index 987fd97354..2f2e591b37 100644 --- a/src/calibre/ebooks/lrf/lit/convert_from.py +++ b/src/calibre/ebooks/lrf/lit/convert_from.py @@ -3,19 +3,12 @@ __copyright__ = '2008, Kovid Goyal ' import os, sys, shutil, glob, logging from tempfile import mkdtemp -from subprocess import Popen, PIPE from calibre.ebooks.lrf import option_parser as lrf_option_parser from calibre.ebooks.lit.reader import LitReader from calibre.ebooks import ConversionError from calibre.ebooks.lrf.html.convert_from import process_file as html_process_file from calibre.ebooks.metadata.opf import OPFReader -from calibre import isosx, __appname__, setup_cli_handlers, islinux - -CLIT = 'clit' -if isosx and hasattr(sys, 'frameworks_dir'): - CLIT = os.path.join(getattr(sys, 'frameworks_dir'), CLIT) -if islinux and getattr(sys, 'frozen_path', False): - CLIT = os.path.join(getattr(sys, 'frozen_path'), 'clit') +from calibre import __appname__, setup_cli_handlers def option_parser(): parser = lrf_option_parser( @@ -24,11 +17,9 @@ _('''Usage: %prog [options] mybook.lit %prog converts mybook.lit to mybook.lrf''') ) - parser.add_option('--lit2oeb', default=False, dest='lit2oeb', action='store_true', - help='Use the new lit2oeb to convert lit files instead of convertlit.') return parser -def generate_html2(pathtolit, logger): +def generate_html(pathtolit, logger): if not os.access(pathtolit, os.R_OK): raise ConversionError, 'Cannot read from ' + pathtolit tdir = mkdtemp(prefix=__appname__+'_'+'lit2oeb_') @@ -37,36 +28,13 @@ def generate_html2(pathtolit, logger): lr.extract_content(tdir) return tdir -def generate_html(pathtolit, logger): - if isinstance(pathtolit, unicode): - pathtolit = pathtolit.encode(sys.getfilesystemencoding()) - if not os.access(pathtolit, os.R_OK): - raise ConversionError, 'Cannot read from ' + pathtolit - tdir = mkdtemp(prefix=__appname__+'_') - os.rmdir(tdir) - cmd = [CLIT, pathtolit, '%s'%(tdir+os.sep)] - logger.debug(repr(cmd)) - p = Popen(cmd, stderr=PIPE, stdout=PIPE) - stdout = p.stdout.read() - err = p.stderr.read() - logger.info(p.stdout.read()) - ret = p.wait() - if ret != 0: - if os.path.exists(tdir) and os.path.isdir(tdir): - shutil.rmtree(tdir) - if 'keys.txt' in unicode(err)+unicode(stdout): - raise ConversionError('This lit file is protected by DRM. You must first use the ConvertLIT program to remove the DRM. Doing so may be illegal, and so %s does not do this, nor does it provide instructions on how to do it.'%(__appname__,)) - raise ConversionError, err - return tdir - def process_file(path, options, logger=None): if logger is None: level = logging.DEBUG if options.verbose else logging.INFO logger = logging.getLogger('lit2lrf') setup_cli_handlers(logger, level) lit = os.path.abspath(os.path.expanduser(path)) - tdir = generate_html2(lit, logger) if getattr(options, 'lit2oeb', False) \ - else generate_html(lit, logger) + tdir = generate_html(lit, logger) try: opf = glob.glob(os.path.join(tdir, '*.opf')) if opf: diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index ed9a8483a0..15ee30b09a 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -35,7 +35,6 @@ class Distribution(object): ('ImageMagick', '6.3.5', 'imagemagick', 'imagemagick', 'ImageMagick'), ('xdg-utils', '1.0.2', 'xdg-utils', 'xdg-utils', 'xdg-utils'), ('dbus-python', '0.82.2', 'dbus-python', 'python-dbus', 'dbus-python'), - ('convertlit', '1.8', 'convertlit', None, None), ('lxml', '1.3.3', 'lxml', 'python-lxml', 'python-lxml'), ('help2man', '1.36.4', 'help2man', 'help2man', 'help2man'), ] @@ -49,10 +48,7 @@ class Distribution(object): 'fedora':'Fedora 8', 'debian':'Debian Sid', 'generic': 'Generic Unix'} MANUAL_MAP = { - 'ubuntu' : '

                                                                          • You will have to install convertlit manually to be able to convert LIT files.
                                                                          • ', - 'fedora' : '''
                                                                          • You have to upgrade Qt to at least 4.3.1 and PyQt to at least 4.3.1
                                                                          • '''\ - '''
                                                                          • You will have to install convertlit manually to be able to convert LIT files.
                                                                          • ''', - 'debian' : '
                                                                          • Add the following to /etc/apt/sources.list
                                                                            deb http://www.debian-multimedia.org sid main
                                                                            Then
                                                                            apt-get install clit
                                                                          • ', + 'fedora' : '''
                                                                          • You have to upgrade Qt to at least 4.4.0 and PyQt to at least 4.4.2
                                                                          • ''', } def __init__(self, os): diff --git a/upload.py b/upload.py index f6df21b484..0cc4d99e61 100644 --- a/upload.py +++ b/upload.py @@ -220,7 +220,7 @@ def stage_one(): os.mkdir('build') shutil.rmtree('docs') os.mkdir('docs') - subprocess.call('python setup.py develop', shell=True) + check_call('python setup.py build', shell=True) check_call('sudo python setup.py develop', shell=True) check_call('make', shell=True) tag_release() From 73e7c29de0a5bc0ab82254a547ff8f6865dc0306 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Aug 2008 23:14:34 -0700 Subject: [PATCH 15/31] Fix saving to disk (in a single directory) of books with no formats --- src/calibre/library/database.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index e84e9b66e3..73ecc91742 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1413,7 +1413,10 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; mi.render(f) f.close() - for fmt in self.formats(idx, index_is_id=index_is_id).split(','): + fmts = self.formats(idx, index_is_id=index_is_id) + if not fmts: + fmts = '' + for fmt in fmts.split(','): data = self.format(idx, fmt, index_is_id=index_is_id) fname = name +'.'+fmt.lower() fname = sanitize_file_name(fname) From ecbf38a3d6f623c822edfb8258e6f21147051d01 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Aug 2008 03:03:37 -0700 Subject: [PATCH 16/31] IGN:... --- installer/windows/calibre/calibre.mpi | 2 -- pyqtdistutils.py | 7 ++++--- upload.py | 3 +++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/installer/windows/calibre/calibre.mpi b/installer/windows/calibre/calibre.mpi index 35de36caab..5d70665c2b 100644 --- a/installer/windows/calibre/calibre.mpi +++ b/installer/windows/calibre/calibre.mpi @@ -216,7 +216,6 @@ File ::0F47A44E-E347-1CD4-E89F-37B447C4A270 -type dir -name driver -parent 6CCF3 File ::A146565C-D163-7F68-7C70-A6A336B32526 -type dir -name iconengines -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::3245B06C-1C22-1A8A-5710-6D36651AAA70 -name etree.pyd -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::B49A5610-13F6-FB5D-0673-DB47C6BB385D -name rtf-meta.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 -File ::1F7D32C6-D61D-A09F-6D9E-690F7DD10D04 -name clit.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::CE4F2A21-12CC-2B9A-6D48-6A0FEA7C9D13 -name _compiled_base.pyd -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::D6C46340-8335-7FC4-A027-D701DF1B70AB -name pdf2lrf.exe -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::53F2B07D-8F92-2328-C55E-5F7F0E63D5DB -name opf-meta.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 @@ -347,7 +346,6 @@ File ::ACE1537B-B234-3C90-759A-8947A7AADC77 -name mobi2oeb.exe -parent 6CCF3F71- File ::92701E8F-1D91-A796-C899-2A266029F61D -name _socket.pyd -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::45BD27B5-B910-7633-C827-37E82E89C27C -name w9xpopen.exe.local -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::45C27909-D761-787F-84B2-66596E5C4E99 -name bz2.pyd -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 -File ::7B2DE5D8-17A6-B167-ABC7-799AEBCC1C02 -name clit.exe -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::36E8EEAC-F54D-5DE9-02D8-ECDFEBB4B5E2 -type dir -name plugins -parent 6CCF3F71-74BB-ED69-D0E6-9F12348ABDD3 File ::71930E14-A27B-C23C-8D94-C7E97ADB8723 -name pictureflow.pyd -parent 36E8EEAC-F54D-5DE9-02D8-ECDFEBB4B5E2 File ::293E6ABE-17C9-5E53-1B44-C27029C8C061 -name winutil.pyd -parent 36E8EEAC-F54D-5DE9-02D8-ECDFEBB4B5E2 diff --git a/pyqtdistutils.py b/pyqtdistutils.py index f80486e314..2291efba01 100644 --- a/pyqtdistutils.py +++ b/pyqtdistutils.py @@ -14,8 +14,9 @@ from distutils import log import sipconfig, os, sys, string, glob, shutil from PyQt4 import pyqtconfig iswindows = 'win32' in sys.platform +QMAKE = os.path.expanduser('~/qt/bin/qmake') if 'darwin' in sys.platform else'qmake' WINDOWS_PYTHON = ['C:/Python25/libs'] -OSX_SDK = 'TODO:' +OSX_SDK = '/Developer/SDKs/MacOSX10.4u.sdk' def replace_suffix(path, new_suffix): return os.path.splitext(path)[0] + new_suffix @@ -62,10 +63,10 @@ VERSION = 1.0.0 CONFIG += x86 ppc '''%(name, ' '.join(headers), ' '.join(sources)) open(name+'.pro', 'wb').write(pro) - self.spawn(['qmake', '-o', 'Makefile.qt', name+'.pro']) + self.spawn([QMAKE, '-o', 'Makefile.qt', name+'.pro']) self.make('Makefile.qt') pat = 'release\\*.o' if iswindows else '*.o' - return glob.glob(pat) + return map(os.path.abspath, glob.glob(pat)) finally: os.chdir(cwd) diff --git a/upload.py b/upload.py index 0cc4d99e61..fc8a1754c2 100644 --- a/upload.py +++ b/upload.py @@ -75,6 +75,8 @@ def build_windows(shutdown=True): installer = installer_name('exe') vm = '/vmware/Windows XP/Windows XP Professional.vmx' start_vm(vm, 'windows', BUILD_SCRIPT%('python setup.py develop', 'python','installer\\\\windows\\\\freeze.py')) + if os.path.exists('build/py2exe'): + shutil.rmtree('build/py2exe') subprocess.check_call(('scp', '-rp', 'windows:build/%s/build/py2exe'%PROJECT, 'build')) if not os.path.exists('build/py2exe'): raise Exception('Failed to run py2exe') @@ -240,6 +242,7 @@ def stage_three(): upload_user_manual() check_call('python setup.py register bdist_egg --exclude-source-files upload') check_call('''rm -rf dist/* build/*''') + check_call('''ssh divok bzr update /var/www/calibre.kovidgoyal.net/calibre/''') def main(args=sys.argv): print 'Starting stage one...' From 457dbf9a825153094ceee50d69fcc3acc67672bc Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Wed, 6 Aug 2008 15:42:09 -0400 Subject: [PATCH 17/31] Fix some erroneously formed 'except' statements --- src/calibre/ebooks/metadata/meta.py | 4 ++-- src/calibre/ebooks/mobi/reader.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py index 15db121cb0..1c84af8009 100644 --- a/src/calibre/ebooks/metadata/meta.py +++ b/src/calibre/ebooks/metadata/meta.py @@ -134,12 +134,12 @@ def metadata_from_filename(name, pat=None): try: si = match.group('series_index') mi.series_index = int(si) - except IndexError, ValueError: + except (IndexError, ValueError): pass try: si = match.group('isbn') mi.isbn = si - except IndexError, ValueError: + except (IndexError, ValueError): pass if not mi.title: mi.title = name diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 9c5ba7839f..7053b7591f 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -93,7 +93,7 @@ class BookHeader(object): 1252 : 'cp1252', 65001 : 'utf-8', }[self.codepage] - except IndexError, KeyError: + except (IndexError, KeyError): print '[WARNING] Unknown codepage %d. Assuming cp-1252'%self.codepage self.codec = 'cp1252' From fcdc318a69256c2757fcc7482a3bed5298c5b3d4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Aug 2008 14:39:20 -0700 Subject: [PATCH 18/31] Fix handling of MOBI files with bogus codepages. --- src/calibre/ebooks/mobi/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 9c5ba7839f..7053b7591f 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -93,7 +93,7 @@ class BookHeader(object): 1252 : 'cp1252', 65001 : 'utf-8', }[self.codepage] - except IndexError, KeyError: + except (IndexError, KeyError): print '[WARNING] Unknown codepage %d. Assuming cp-1252'%self.codepage self.codec = 'cp1252' From aa9f6fab799a25f5a27f31bb6ba282c7caa3a3fd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Aug 2008 15:33:41 -0700 Subject: [PATCH 19/31] Fix regression in epub2lrf --- src/calibre/ebooks/lrf/epub/convert_from.py | 4 ++-- src/calibre/utils/zipfile.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/lrf/epub/convert_from.py b/src/calibre/ebooks/lrf/epub/convert_from.py index 701681243e..110946824b 100644 --- a/src/calibre/ebooks/lrf/epub/convert_from.py +++ b/src/calibre/ebooks/lrf/epub/convert_from.py @@ -8,7 +8,7 @@ from calibre.ebooks import ConversionError from calibre.ebooks.lrf.html.convert_from import process_file as html_process_file from calibre.ebooks.metadata.opf import OPF from calibre.ebooks.metadata.epub import OCFDirReader -from calibre.libunzip import extract as zip_extract +from calibre.utils.zipfile import ZipFile from calibre import __appname__, setup_cli_handlers @@ -26,7 +26,7 @@ def generate_html(pathtoepub, logger): tdir = mkdtemp(prefix=__appname__+'_') os.rmdir(tdir) try: - zip_extract(pathtoepub, tdir) + ZipFile(pathtoepub).extractall(tdir) except: if os.path.exists(tdir) and os.path.isdir(tdir): shutil.rmtree(tdir) diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index ff31210444..ff9eacf158 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -1028,7 +1028,7 @@ class ZipFile: # Create all upper directories if necessary. upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.isdir(upperdirs): + if upperdirs and os.path.exists(upperdirs) and not os.path.isdir(upperdirs): os.unlink(upperdirs) if upperdirs and not os.path.exists(upperdirs): os.makedirs(upperdirs) From ce48ed2038a6441bf550766164872bb76e52e31f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 7 Aug 2008 02:41:45 -0700 Subject: [PATCH 20/31] version 0.4.83 --- src/calibre/__init__.py | 2 +- src/calibre/gui2/device.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 79467dd5b4..f3ebd37741 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.82' +__version__ = '0.4.83' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 9d76f6cf67..2dab6aceb5 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -4,7 +4,6 @@ import os, traceback from PyQt4.QtCore import QThread, SIGNAL, QObject -from calibre import iswindows from calibre.devices import devices from calibre.devices.scanner import DeviceScanner From 7998201e0ee705631e8c445c2dbc1897fa489aff Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 7 Aug 2008 02:43:46 -0700 Subject: [PATCH 21/31] IGN:Tag release From 9200e202ce96d60a344ca2d6a3daec7d69e0ba3c Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Mon, 11 Aug 2008 10:01:21 -0400 Subject: [PATCH 22/31] Fix #939 (lit2oeb: generates incorrect image tags in some cases) --- src/calibre/ebooks/lit/reader.py | 48 +++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index d9924a2454..995b698de4 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -107,11 +107,12 @@ class UnBinary(object): AMPERSAND_RE = re.compile( r'&(?!(?:#[0-9]+|#x[0-9a-fA-F]+|[a-zA-Z_:][a-zA-Z0-9.-_:]+);)') - def __init__(self, bin, manifest, map=OPF_MAP): + def __init__(self, bin, path, manifest, map=OPF_MAP): self.manifest = manifest self.tag_map, self.attr_map, self.tag_to_attr_map = map self.opf = map is OPF_MAP self.bin = bin + self.dir = os.path.dirname(path) self.buf = cStringIO.StringIO() self.binary_to_text() self.raw = self.buf.getvalue().lstrip().decode('utf-8') @@ -122,9 +123,19 @@ class UnBinary(object): def item_path(self, internal_id): try: - return self.manifest[internal_id].path + target = self.manifest[internal_id].path except KeyError: return internal_id + if not self.dir: + return target + target = target.split('/') + base = self.dir.split('/') + for index in xrange(min(len(base), len(target))): + if base[index] != target[index]: break + else: + index += 1 + relpath = (['..'] * (len(base) - index)) + target[index:] + return '/'.join(relpath) def __unicode__(self): return self.raw @@ -597,15 +608,16 @@ class LitReader(object): item.path = os.path.basename(item.path) def _read_meta(self): + path = 'content.opf' raw = self.get_file('/meta') try: - xml = OPF_DECL + unicode(UnBinary(raw, self.manifest, OPF_MAP)) + xml = OPF_DECL + unicode(UnBinary(raw, path, self.manifest, OPF_MAP)) except LitError: if 'PENGUIN group' not in raw: raise print "WARNING: attempting PENGUIN malformed OPF fix" raw = raw.replace( 'PENGUIN group', '\x00\x01\x18\x00PENGUIN group', 1) - xml = OPF_DECL + unicode(UnBinary(raw, self.manifest, OPF_MAP)) + xml = OPF_DECL + unicode(UnBinary(raw, path, self.manifest, OPF_MAP)) self.meta = xml def _read_drm(self): @@ -645,13 +657,6 @@ class LitReader(object): key[i % 8] ^= ord(digest[i]) return ''.join(chr(x) for x in key) - def get_markup_file(self, name): - raw = self.get_file(name) - decl, map = (OPF_DECL, OPF_MAP) \ - if name == '/meta' else (HTML_DECL, HTML_MAP) - xml = decl + unicode(UnBinary(raw, self.manifest, map)) - return xml - def get_file(self, name): entry = self.entries[name] if entry.section == 0: @@ -748,6 +753,20 @@ class LitReader(object): raise LitError("Failed to completely decompress section") return ''.join(result) + def get_entry_content(self, entry): + if 'spine' in entry.state: + name = '/'.join(('/data', entry.internal, 'content')) + path = entry.path + raw = self.get_file(name) + decl, map = (OPF_DECL, OPF_MAP) \ + if name == '/meta' else (HTML_DECL, HTML_MAP) + content = decl + unicode(UnBinary(raw, path, self.manifest, map)) + content = content.encode('utf-8') + else: + name = '/'.join(('/data', entry.internal)) + content = self.get_file(name) + return content + def extract_content(self, output_dir=os.getcwdu()): output_dir = os.path.abspath(output_dir) try: @@ -763,12 +782,7 @@ class LitReader(object): path = os.path.join(output_dir, entry.path) self._ensure_dir(path) with open(path, 'wb') as f: - if 'spine' in entry.state: - name = '/'.join(('/data', entry.internal, 'content')) - f.write(self.get_markup_file(name).encode('utf-8')) - else: - name = '/'.join(('/data', entry.internal)) - f.write(self.get_file(name)) + f.write(self.get_entry_content(entry)) def _ensure_dir(self, path): dir = os.path.dirname(path) From 3f6d486fb897710c88a4e58af6f90316d9ba8515 Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Mon, 11 Aug 2008 12:11:10 -0400 Subject: [PATCH 23/31] Fix #941 (Raw UTF-8 misinterpreted in HTML with explicitly specified encoding) --- src/calibre/ebooks/lit/reader.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 995b698de4..1376363d45 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -158,7 +158,7 @@ class UnBinary(object): continue elif c == '\v': c = '\n' - self.buf.write(c.encode('utf-8')) + self.buf.write(c.encode('ascii', 'xmlcharrefreplace')) elif state == 'get flags': if oc == 0: @@ -258,7 +258,8 @@ class UnBinary(object): state = 'get attr' elif count > 0: if not in_censorship: - self.buf.write(unicode(c).encode('utf-8')) + self.buf.write(c.encode( + 'ascii', 'xmlcharrefreplace')) count -= 1 if count == 0: if not in_censorship: @@ -310,7 +311,8 @@ class UnBinary(object): path = self.item_path(doc) if m and frag: path += m + frag - self.buf.write((u'"%s"' % path).encode('utf-8')) + self.buf.write((u'"%s"' % path).encode( + 'ascii', 'xmlcharrefreplace')) state = 'get attr' return index From 673ef45d66a28e0ad46e9a67f1fcca6b3fdf0709 Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Mon, 11 Aug 2008 12:32:02 -0400 Subject: [PATCH 24/31] Fix #938 (lit2oeb: Crash converting some LIT files) --- src/calibre/ebooks/lit/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 1376363d45..b2effb60b9 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -217,7 +217,7 @@ class UnBinary(object): state = 'get attr length' continue attr = None - if oc in current_map and current_map[oc]: + if current_map and oc in current_map and current_map[oc]: attr = current_map[oc] elif oc in self.attr_map: attr = self.attr_map[oc] From a0af594e16544a5339603da0e4d67c622a760a8c Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Mon, 11 Aug 2008 16:32:27 -0400 Subject: [PATCH 25/31] Implement #942 (Add markup pretty-printing option to 'lit2oeb') --- src/calibre/ebooks/lit/reader.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index b2effb60b9..b76f6fb4f0 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -10,6 +10,7 @@ __copyright__ = '2008, Kovid Goyal ' \ import sys, struct, cStringIO, os import functools import re +from lxml import etree from calibre.ebooks.lit import LitError from calibre.ebooks.lit.maps import OPF_MAP, HTML_MAP import calibre.ebooks.lit.mssha1 as mssha1 @@ -17,6 +18,8 @@ from calibre import plugins lzx, lxzerror = plugins['lzx'] msdes, msdeserror = plugins['msdes'] +XML_DECL = """ +""" OPF_DECL = """ Date: Tue, 12 Aug 2008 11:10:10 -0700 Subject: [PATCH 26/31] Refactor job control system. --- src/calibre/ebooks/lrf/html/table_as_image.py | 19 +- src/calibre/gui2/__init__.py | 17 +- src/calibre/gui2/device.py | 253 ++++++----- src/calibre/gui2/dialogs/jobs.py | 14 +- src/calibre/gui2/jobs.py | 415 ------------------ src/calibre/gui2/jobs2.py | 193 ++++++++ src/calibre/gui2/main.py | 260 +++++------ src/calibre/gui2/status.py | 11 +- src/calibre/gui2/widgets.py | 8 +- src/calibre/manual/faq.rst | 2 +- src/calibre/parallel.py | 245 +++++++---- src/calibre/web/feeds/news.py | 4 +- 12 files changed, 675 insertions(+), 766 deletions(-) delete mode 100644 src/calibre/gui2/jobs.py create mode 100644 src/calibre/gui2/jobs2.py diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py index f4bdfa973d..6db42865be 100644 --- a/src/calibre/ebooks/lrf/html/table_as_image.py +++ b/src/calibre/ebooks/lrf/html/table_as_image.py @@ -10,6 +10,8 @@ import os, tempfile, atexit, shutil, time from PyQt4.Qt import QWebPage, QUrl, QApplication, QSize, \ SIGNAL, QPainter, QImage, QObject, Qt +from calibre.parallel import ParallelJob + __app = None class HTMLTableRenderer(QObject): @@ -80,18 +82,17 @@ def render_table(server, soup, table, css, base_dir, width, height, dpi, factor= '''%(head, width-10, style, unicode(table)) - server.run_job(1, 'render_table', + job = ParallelJob('render_table', lambda j : j, None, args=[html, base_dir, width, height, dpi, factor]) - res = None - while res is None: + server.add_job(job) + while not job.has_run: time.sleep(2) - res = server.result(1) - result, exception, traceback = res - if exception: + + if job.exception is not None: print 'Failed to render table' - print exception - print traceback - images, tdir = result + print job.exception + print job.traceback + images, tdir = job.result atexit.register(shutil.rmtree, tdir) return images diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index cfa50cdd15..8c2b8e51b4 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ import sys, os, re, StringIO, traceback -from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, \ +from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, \ QByteArray, QLocale, QUrl, QTranslator, QCoreApplication from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ QIcon, QTableView, QDialogButtonBox, QApplication @@ -84,6 +84,21 @@ def human_readable(size): size = size[:-2] return size + " " + suffix +class Dispatcher(QObject): + '''Convenience class to ensure that a function call always happens in the GUI thread''' + + def __init__(self, func): + QObject.__init__(self) + self.func = func + self.connect(self, SIGNAL('edispatch(PyQt_PyObject, PyQt_PyObject)'), + self.dispatch, Qt.QueuedConnection) + + def __call__(self, *args, **kwargs): + self.emit(SIGNAL('edispatch(PyQt_PyObject, PyQt_PyObject)'), args, kwargs) + + def dispatch(self, args, kwargs): + self.func(*args, **kwargs) + class TableView(QTableView): def __init__(self, parent): diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 2dab6aceb5..33f5585411 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1,130 +1,185 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, traceback - -from PyQt4.QtCore import QThread, SIGNAL, QObject +import os, traceback, Queue, time +from threading import Thread from calibre.devices import devices +from calibre.parallel import Job from calibre.devices.scanner import DeviceScanner -class DeviceDetector(QThread): + +class DeviceJob(Job): + + def __init__(self, func, *args, **kwargs): + Job.__init__(self, *args, **kwargs) + self.func = func + + def run(self): + self.start_work() + try: + self.result = self.func(*self.args, **self.kwargs) + except (Exception, SystemExit), err: + self.exception = err + self.traceback = traceback.format_exc() + finally: + self.job_done() + + +class DeviceManager(Thread): ''' Worker thread that polls the USB ports for devices. Emits the signal connected(PyQt_PyObject, PyQt_PyObject) on connection and disconnection events. ''' - def __init__(self, sleep_time=2000): + def __init__(self, connected_slot, job_manager, sleep_time=2): ''' @param sleep_time: Time to sleep between device probes in millisecs @type sleep_time: integer ''' - self.devices = [[d, False] for d in devices()] - self.sleep_time = sleep_time - QThread.__init__(self) - self.keep_going = True + Thread.__init__(self) + self.setDaemon(True) + self.devices = [[d, False] for d in devices()] + self.device = None + self.device_class = None + self.sleep_time = sleep_time + self.connected_slot = connected_slot + self.jobs = Queue.Queue(0) + self.keep_going = True + self.job_manager = job_manager + self.current_job = None + self.scanner = DeviceScanner() - def run(self): - scanner = DeviceScanner() - while self.keep_going: - scanner.scan() - for device in self.devices: - connected = scanner.is_device_connected(device[0]) - if connected and not device[1]: + def detect_device(self): + self.scanner.scan() + for device in self.devices: + connected = self.scanner.is_device_connected(device[0]) + if connected and not device[1]: + try: + dev = device[0]() + dev.open() + self.device = dev + self.device_class = dev.__class__ + self.connected_slot(True) + except: + print 'Unable to open device' + traceback.print_exc() + finally: + device[1] = True + elif not connected and device[1]: + while True: try: - dev = device[0]() - dev.open() - self.emit(SIGNAL('connected(PyQt_PyObject, PyQt_PyObject)'), dev, True) - except: - print 'Unable to open device' - traceback.print_exc() - finally: - device[1] = True - elif not connected and device[1]: - self.emit(SIGNAL('connected(PyQt_PyObject, PyQt_PyObject)'), device[0], False) - device[1] ^= True - self.msleep(self.sleep_time) + job = self.jobs.get_nowait() + job.abort(Exception(_('Device no longer connected.'))) + except Queue.Empty: + break + self.device = None + self.connected_slot(False) + device[1] ^= True + + def next(self): + if not self.jobs.empty(): + try: + return self.jobs.get_nowait() + except Queue.Empty: + pass + + def run(self): + while self.keep_going: + self.detect_device() + while True: + job = self.next() + if job is not None: + self.current_job = job + self.device.set_progress_reporter(job.update_status) + self.current_job.run() + self.current_job = None + else: + break + time.sleep(self.sleep_time) - - -class DeviceManager(QObject): - def __init__(self, device): - QObject.__init__(self) - self.device_class = device.__class__ - self.device = device - - def device_removed(self): - self.device = None - - def info_func(self): - ''' Return callable that returns device information and free space on device''' - def get_device_information(updater): - '''Get device information''' - self.device.set_progress_reporter(updater) - info = self.device.get_device_information(end_session=False) - info = [i.replace('\x00', '').replace('\x01', '') for i in info] - cp = self.device.card_prefix(end_session=False) - fs = self.device.free_space() - return info, cp, fs - return get_device_information + def create_job(self, func, done, description, args=[], kwargs={}): + job = DeviceJob(func, done, self.job_manager, + args=args, kwargs=kwargs, description=description) + self.job_manager.add_job(job) + self.jobs.put(job) + return job - def books_func(self): + def _get_device_information(self): + info = self.device.get_device_information(end_session=False) + info = [i.replace('\x00', '').replace('\x01', '') for i in info] + cp = self.device.card_prefix(end_session=False) + fs = self.device.free_space() + return info, cp, fs + + def get_device_information(self, done): + '''Get device information and free space on device''' + return self.create_job(self._get_device_information, done, + description=_('Get device information')) + + + def _books(self): + '''Get metadata from device''' + mainlist = self.device.books(oncard=False, end_session=False) + cardlist = self.device.books(oncard=True) + return (mainlist, cardlist) + + def books(self, done): '''Return callable that returns the list of books on device as two booklists''' - def books(updater): - '''Get metadata from device''' - self.device.set_progress_reporter(updater) - mainlist = self.device.books(oncard=False, end_session=False) - cardlist = self.device.books(oncard=True) - return (mainlist, cardlist) - return books + return self.create_job(self._books, done, description=_('Get list of books on device')) - def sync_booklists_func(self): - '''Upload booklists to device''' - def sync_booklists(updater, booklists): - '''Sync metadata to device''' - self.device.set_progress_reporter(updater) - self.device.sync_booklists(booklists, end_session=False) - return self.device.card_prefix(end_session=False), self.device.free_space() - return sync_booklists + def _sync_booklists(self, booklists): + '''Sync metadata to device''' + self.device.sync_booklists(booklists, end_session=False) + return self.device.card_prefix(end_session=False), self.device.free_space() - def upload_books_func(self): - '''Upload books to device''' - def upload_books(updater, files, names, on_card=False): - '''Upload books to device: ''' - self.device.set_progress_reporter(updater) - return self.device.upload_books(files, names, on_card, end_session=False) - return upload_books + def sync_booklists(self, done, booklists): + return self.create_job(self._sync_booklists, done, args=[booklists], + description=_('Send metadata to device')) + def _upload_books(self, files, names, on_card=False): + '''Upload books to device: ''' + return self.device.upload_books(files, names, on_card, end_session=False) + + def upload_books(self, done, files, names, on_card=False, titles=None): + desc = _('Upload %d books to device')%len(names) + if titles: + desc += u':' + u', '.join(titles) + return self.create_job(self._upload_books, done, args=[files, names], + kwargs={'on_card':on_card}, description=desc) + def add_books_to_metadata(self, locations, metadata, booklists): - self.device_class.add_books_to_metadata(locations, metadata, booklists) + self.device.add_books_to_metadata(locations, metadata, booklists) - def delete_books_func(self): + def _delete_books(self, paths): '''Remove books from device''' - def delete_books(updater, paths): - '''Remove books from device''' - self.device.delete_books(paths, end_session=True) - return delete_books + self.device.delete_books(paths, end_session=True) + + def delete_books(self, done, paths): + return self.create_job(self._delete_books, done, args=[paths], + description=_('Delete books from device')) def remove_books_from_metadata(self, paths, booklists): - self.device_class.remove_books_from_metadata(paths, booklists) + self.device.remove_books_from_metadata(paths, booklists) - def save_books_func(self): - '''Copy books from device to disk''' - def save_books(updater, paths, target): - '''Copy books from device to disk''' - self.device.set_progress_reporter(updater) - for path in paths: - name = path.rpartition('/')[2] - f = open(os.path.join(target, name), 'wb') - self.device.get_file(path, f) - f.close() - return save_books - - def view_book_func(self): - '''Copy book from device to local hdd for viewing''' - def view_book(updater, path, target): - self.device.set_progress_reporter(updater) - f = open(target, 'wb') + def _save_books(self, paths, target): + '''Copy books from device to disk''' + for path in paths: + name = path.rpartition('/')[2] + f = open(os.path.join(target, name), 'wb') self.device.get_file(path, f) f.close() - return target - return view_book + + def save_books(self, done, paths, target): + return self.create_job(self._save_books, done, args=[paths, target], + description=_('Download books from device')) + + def _view_book(self, path, target): + f = open(target, 'wb') + self.device.get_file(path, f) + f.close() + return target + + def view_book(self, done, path, target): + return self.create_job(self._view_book, done, args=[path, target], + description=_('View book on device')) + \ No newline at end of file diff --git a/src/calibre/gui2/dialogs/jobs.py b/src/calibre/gui2/dialogs/jobs.py index e0682b6bd8..ced7f2ee10 100644 --- a/src/calibre/gui2/dialogs/jobs.py +++ b/src/calibre/gui2/dialogs/jobs.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' '''Display active jobs''' -from PyQt4.QtCore import Qt, QObject, SIGNAL, QSize, QString +from PyQt4.QtCore import Qt, QObject, SIGNAL, QSize, QString, QTimer from PyQt4.QtGui import QDialog, QAbstractItemDelegate, QStyleOptionProgressBarV2, \ QApplication, QStyle @@ -44,11 +44,21 @@ class JobsDialog(QDialog, Ui_JobsDialog): self.jobs_view.model().kill_job) self.pb_delegate = ProgressBarDelegate(self) self.jobs_view.setItemDelegateForColumn(2, self.pb_delegate) + + self.running_time_timer = QTimer(self) + self.connect(self.running_time_timer, SIGNAL('timeout()'), self.update_running_time) + self.running_time_timer.start(1000) + + def update_running_time(self): + model = self.model + for row, job in enumerate(model.jobs): + if job.is_running: + self.jobs_view.dataChanged(model.index(row, 3), model.index(row, 3)) def kill_job(self): for index in self.jobs_view.selectedIndexes(): row = index.row() - self.emit(SIGNAL('kill_job(int, PyQt_PyObject)'), row, self) + self.model.kill_job(row, self) return def closeEvent(self, e): diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py deleted file mode 100644 index 8e6246d8d9..0000000000 --- a/src/calibre/gui2/jobs.py +++ /dev/null @@ -1,415 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' -import traceback, logging, collections, time - -from PyQt4.QtCore import QAbstractTableModel, QMutex, QObject, SIGNAL, Qt, \ - QVariant, QThread -from PyQt4.QtGui import QIcon, QDialog - -from calibre import detect_ncpus, Settings -from calibre.gui2 import NONE, error_dialog -from calibre.parallel import Server -from calibre.gui2.dialogs.job_view_ui import Ui_Dialog - -class JobException(Exception): - pass - -class Job(QThread): - ''' Class to run a function in a separate thread with optional mutex based locking.''' - def __init__(self, id, description, slot, priority, func, *args, **kwargs): - ''' - @param id: Number. Id of this thread. - @param description: String. Description of this job. - @param slot: The callable that should be called when the job is done. - @param priority: The priority with which this thread should be run - @param func: A callable that should be executed in this thread. - ''' - QThread.__init__(self) - self.id = id - self.func = func - self.description = description if description else 'Job #' + str(self.id) - self.args = args - self.kwargs = kwargs - self.slot, self._priority = slot, priority - self.result = None - self.percent_done = 0 - self.logger = logging.getLogger('Job #'+str(id)) - self.logger.setLevel(logging.DEBUG) - self.is_locked = False - self.log = self.exception = self.last_traceback = None - self.connect_done_signal() - self.start_time = None - - - def start(self): - self.start_time = time.time() - QThread.start(self, self._priority) - - def progress_update(self, val): - self.percent_done = val - self.emit(SIGNAL('status_update(int, int)'), self.id, int(val)) - - def formatted_log(self): - if self.log is None: - return '' - return '

                                                                            Log:

                                                                            %s
                                                                            '%self.log - - -class DeviceJob(Job): - ''' Jobs that involve communication with the device. ''' - def run(self): - last_traceback, exception = None, None - - try: - self.result = self.func(self.progress_update, *self.args, **self.kwargs) - except Exception, err: - exception = err - last_traceback = traceback.format_exc() - - self.exception, self.last_traceback = exception, last_traceback - - def formatted_error(self): - if self.exception is None: - return '' - ans = u'

                                                                            %s: %s

                                                                            '%(self.exception.__class__.__name__, self.exception) - ans += '

                                                                            Traceback:

                                                                            %s
                                                                            '%self.last_traceback - return ans - - def notify(self): - self.emit(SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), - self.id, self.description, self.result, self.exception, self.last_traceback) - - def connect_done_signal(self): - if self.slot is not None: - self.connect(self, SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), - self.slot, Qt.QueuedConnection) - -class ConversionJob(Job): - ''' Jobs that involve conversion of content.''' - def __init__(self, *args, **kwdargs): - Job.__init__(self, *args, **kwdargs) - self.log = '' - - def run(self): - result = None - self.server.run_job(self.id, self.func, progress=self.progress, - args=self.args, kwdargs=self.kwargs, - output=self.output) - res = None - while res is None: - time.sleep(2) - res = self.server.result(self.id) - if res is None: - exception, tb = 'UnknownError: This should not have happened', '' - else: - result, exception, tb = res - self.result, self.last_traceback, self.exception = result, tb, exception - - def output(self, msg): - if self.log is None: - self.log = '' - self.log += msg - self.emit(SIGNAL('output_received()')) - - def formatted_log(self): - return '

                                                                            Log:

                                                                            %s
                                                                            '%self.log - - def notify(self): - self.emit(SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), - self.id, self.description, self.result, self.exception, self.last_traceback, self.log) - - def connect_done_signal(self): - if self.slot is not None: - self.connect(self, SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), - self.slot, Qt.QueuedConnection) - - def formatted_error(self): - if self.exception is None: - return '' - ans = u'

                                                                            %s:'%repr(self.exception) - ans += '

                                                                            Traceback:

                                                                            %s
                                                                            '%self.last_traceback - return ans - - def progress(self, percent, msg): - self.emit(SIGNAL('update_progress(int, PyQt_PyObject)'), self.id, percent) - -class JobManager(QAbstractTableModel): - - PRIORITY = {'Idle' : QThread.IdlePriority, - 'Lowest': QThread.LowestPriority, - 'Low' : QThread.LowPriority, - 'Normal': QThread.NormalPriority - } - - def __init__(self): - QAbstractTableModel.__init__(self) - self.waiting_jobs = collections.deque() - self.running_jobs = collections.deque() - self.finished_jobs = collections.deque() - self.add_queue = collections.deque() - self.update_lock = QMutex() # Protects write access to the above dequeues - self.next_id = 0 - self.wait_icon = QVariant(QIcon(':/images/jobs.svg')) - self.running_icon = QVariant(QIcon(':/images/exec.svg')) - self.error_icon = QVariant(QIcon(':/images/dialog_error.svg')) - self.done_icon = QVariant(QIcon(':/images/ok.svg')) - - self.process_server = Server() - - self.ncpus = detect_ncpus() - self.timer_id = self.startTimer(500) - - def terminate_device_jobs(self): - for job in self.running_jobs: - if isinstance(job, DeviceJob): - job.terminate() - - def terminate_all_jobs(self): - for job in self.running_jobs: - try: - if isinstance(job, DeviceJob): - job.terminate() - except: - continue - self.process_server.killall() - - def timerEvent(self, event): - if event.timerId() == self.timer_id: - self.update_lock.lock() - try: - refresh = False - - while self.add_queue: - job = self.add_queue.pop() - self.waiting_jobs.append(job) - self.emit(SIGNAL('job_added(int)'), job.id, Qt.QueuedConnection) - refresh = True - - for job in [job for job in self.running_jobs if job.isFinished()]: - self.running_jobs.remove(job) - self.finished_jobs.appendleft(job) - if job.result != self.process_server.KILL_RESULT: - job.notify() - job.running_time = time.time() - job.start_time - self.emit(SIGNAL('job_done(int)'), job.id) - refresh = True - - cjs = list(self.running_conversion_jobs()) - if len(cjs) < self.ncpus: - cj = None - for job in self.waiting_jobs: - if isinstance(job, ConversionJob): - cj = job - break - if cj is not None: - self.waiting_jobs.remove(cj) - cj.start() - self.running_jobs.append(cj) - refresh = True - - djs = list(self.running_device_jobs()) - if len(djs) == 0: - dj = None - for job in self.waiting_jobs: - if isinstance(job, DeviceJob): - dj = job - break - if dj is not None: - self.waiting_jobs.remove(dj) - dj.start() - self.running_jobs.append(dj) - refresh = True - if refresh: - self.reset() - if len(self.running_jobs) == 0: - self.emit(SIGNAL('no_more_jobs()')) - for i in range(len(self.running_jobs)): - self.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), self.index(i, 3), self.index(i, 3)) - finally: - self.update_lock.unlock() - - def has_jobs(self): - return len(self.waiting_jobs) + len(self.running_jobs) > 0 - - def has_device_jobs(self): - return len(tuple(self.running_device_jobs())) > 0 - - def running_device_jobs(self): - for job in self.running_jobs: - if isinstance(job, DeviceJob): - yield job - - def running_conversion_jobs(self): - for job in self.running_jobs: - if isinstance(job, ConversionJob): - yield job - - def update_progress(self, id, percent): - row = -1 - for collection in (self.running_jobs, self.waiting_jobs, self.finished_jobs): - for job in collection: - row += 1 - if job.id == id: - job.percent_done = percent - index = self.index(row, 2) - self.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), index, index) - return - - - def create_job(self, job_class, description, slot, priority, *args, **kwargs): - self.next_id += 1 - id = self.next_id - job = job_class(id, description, slot, priority, *args, **kwargs) - job.server = self.process_server - QObject.connect(job, SIGNAL('status_update(int, int)'), self.status_update, - Qt.QueuedConnection) - self.connect(job, SIGNAL('update_progress(int, PyQt_PyObject)'), - self.update_progress, Qt.QueuedConnection) - self.update_lock.lock() - self.add_queue.append(job) - self.update_lock.unlock() - return job - - def run_conversion_job(self, slot, callable, args=[], **kwargs): - ''' - Run a conversion job. - @param slot: The function to call with the job result. - @param callable: The function to call to communicate with the device. - @param args: The arguments to pass to callable - @param kwargs: The keyword arguments to pass to callable - ''' - desc = kwargs.pop('job_description', '') - if args and hasattr(args[0], 'append') and '--verbose' not in args[0]: - args[0].append('--verbose') - priority = self.PRIORITY[Settings().get('conversion job priority', 'Normal')] - job = self.create_job(ConversionJob, desc, slot, priority, - callable, *args, **kwargs) - return job.id - - def run_device_job(self, slot, callable, *args, **kwargs): - ''' - Run a job to communicate with the device. - @param slot: The function to call with the job result. - @param callable: The function to call to communicate with the device. - @param args: The arguments to pass to callable - @param kwargs: The keyword arguments to pass to callable - ''' - desc = callable.__doc__ if callable.__doc__ else '' - desc += kwargs.pop('job_extra_description', '') - job = self.create_job(DeviceJob, desc, slot, QThread.NormalPriority, - callable, *args, **kwargs) - return job.id - - def rowCount(self, parent): - return len(self.running_jobs) + len(self.waiting_jobs) + len(self.finished_jobs) - - def columnCount(self, parent): - return 4 - - def headerData(self, section, orientation, role): - if role != Qt.DisplayRole: - return NONE - if orientation == Qt.Horizontal: - if section == 0: text = _("Job") - elif section == 1: text = _("Status") - elif section == 2: text = _("Progress") - elif section == 3: text = _('Running time') - return QVariant(text) - else: - return QVariant(section+1) - - def row_to_job(self, row): - if row < len(self.running_jobs): - return self.running_jobs[row], 0 - row -= len(self.running_jobs) - if row < len(self.waiting_jobs): - return self.waiting_jobs[row], 1 - row -= len(self.running_jobs) - return self.finished_jobs[row], 2 - - def data(self, index, role): - if role not in (Qt.DisplayRole, Qt.DecorationRole): - return NONE - row, col = index.row(), index.column() - try: - job, status = self.row_to_job(row) - except IndexError: - return NONE - - if role == Qt.DisplayRole: - if col == 0: - return QVariant(job.description) - if col == 1: - if status == 2: - st = _('Finished') if job.exception is None else _('Error') - else: - st = [_('Working'), _('Waiting')][status] - return QVariant(st) - if col == 2: - return QVariant(int(100*job.percent_done)) - if col == 3: - if job.start_time is None: - return NONE - rtime = job.running_time if hasattr(job, 'running_time') else time.time() - job.start_time - return QVariant('%dm %ds'%(int(rtime)//60, int(rtime)%60)) - if role == Qt.DecorationRole and col == 0: - if status == 1: - return self.wait_icon - if status == 0: - return self.running_icon - if status == 2: - if job.exception or job.result == self.process_server.KILL_RESULT: - return self.error_icon - return self.done_icon - return NONE - - def status_update(self, id, progress): - for i in range(len(self.running_jobs)): - job = self.running_jobs[i] - if job.id == id: - self.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), self.index(i, 2), self.index(i, 3)) - break - - def kill_job(self, row, gui_parent): - job, status = self.row_to_job(row) - if isinstance(job, DeviceJob): - error_dialog(gui_parent, _('Cannot kill job'), - _('Cannot kill jobs that are communicating with the device as this may cause data corruption.')).exec_() - return - if status == 2: - error_dialog(gui_parent, _('Cannot kill job'), - _('Cannot kill already completed jobs.')).exec_() - return - if status == 1: - self.update_lock.lock() - try: - self.waiting_jobs.remove(job) - self.finished_jobs.append(job) - self.emit(SIGNAL('job_done(int)'), job.id) - job.result = self.process_server.KILL_RESULT - finally: - self.update_lock.unlock() - else: - self.process_server.kill(job.id) - self.reset() - if len(self.running_jobs) + len(self.waiting_jobs) == 0: - self.emit(SIGNAL('no_more_jobs()')) - -class DetailView(QDialog, Ui_Dialog): - - def __init__(self, parent, job): - QDialog.__init__(self, parent) - self.setupUi(self) - self.setWindowTitle(job.description) - self.job = job - self.connect(self.job, SIGNAL('output_received()'), self.update) - self.update() - - - def update(self): - txt = self.job.formatted_error() + self.job.formatted_log() - if not txt: - txt = 'No details available' - self.log.setHtml(txt) - vbar = self.log.verticalScrollBar() - vbar.setValue(vbar.maximum()) diff --git a/src/calibre/gui2/jobs2.py b/src/calibre/gui2/jobs2.py new file mode 100644 index 0000000000..9b30a3190e --- /dev/null +++ b/src/calibre/gui2/jobs2.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Job management. +''' +import time +from PyQt4.QtCore import QAbstractTableModel, QVariant, QModelIndex, Qt, SIGNAL +from PyQt4.QtGui import QIcon, QDialog + +from calibre.parallel import ParallelJob, Server +from calibre.gui2 import Dispatcher, error_dialog +from calibre.gui2.device import DeviceJob +from calibre.gui2.dialogs.job_view_ui import Ui_Dialog + +NONE = QVariant() + +class JobManager(QAbstractTableModel): + + wait_icon = QVariant(QIcon(':/images/jobs.svg')) + running_icon = QVariant(QIcon(':/images/exec.svg')) + error_icon = QVariant(QIcon(':/images/dialog_error.svg')) + done_icon = QVariant(QIcon(':/images/ok.svg')) + + def __init__(self): + QAbstractTableModel.__init__(self) + self.jobs = [] + self.server = Server() + self.add_job = Dispatcher(self._add_job) + self.status_update = Dispatcher(self._status_update) + self.start_work = Dispatcher(self._start_work) + self.job_done = Dispatcher(self._job_done) + + def columnCount(self, parent=QModelIndex()): + return 4 + + def rowCount(self, parent=QModelIndex()): + return len(self.jobs) + + def headerData(self, section, orientation, role): + if role != Qt.DisplayRole: + return NONE + if orientation == Qt.Horizontal: + if section == 0: text = _("Job") + elif section == 1: text = _("Status") + elif section == 2: text = _("Progress") + elif section == 3: text = _('Running time') + return QVariant(text) + else: + return QVariant(section+1) + + def data(self, index, role): + try: + if role not in (Qt.DisplayRole, Qt.DecorationRole): + return NONE + row, col = index.row(), index.column() + job = self.jobs[row] + + if role == Qt.DisplayRole: + if col == 0: + desc = job.description + if not desc: + desc = _('Unknown job') + return QVariant(desc) + if col == 1: + status = job.status() + if status == 'DONE': + st = _('Finished') + elif status == 'ERROR': + st = _('Error') + elif status == 'WAITING': + st = _('Waiting') + else: + st = _('Working') + return QVariant(st) + if col == 2: + pc = job.percent + if pc <=0: + percent = 0 + else: + percent = int(100*pc) + return QVariant(percent) + if col == 3: + if job.start_time is None: + return NONE + rtime = job.running_time if job.running_time is not None else \ + time.time() - job.start_time + return QVariant('%dm %ds'%(int(rtime)//60, int(rtime)%60)) + if role == Qt.DecorationRole and col == 0: + status = job.status() + if status == 'WAITING': + return self.wait_icon + if status == 'WORKING': + return self.running_icon + if status == 'ERROR': + return self.error_icon + if status == 'DONE': + return self.done_icon + except: + import traceback + traceback.print_exc() + return NONE + + def _add_job(self, job): + self.emit(SIGNAL('layoutAboutToBeChanged()')) + self.jobs.append(job) + self.jobs.sort() + self.emit(SIGNAL('job_added(int)'), self.rowCount()) + self.emit(SIGNAL('layoutChanged()')) + + def done_jobs(self): + return [j for j in self.jobs if j.status() in ['DONE', 'ERROR']] + + def row_to_job(self, row): + return self.jobs[row] + + def _start_work(self, job): + self.emit(SIGNAL('layoutAboutToBeChanged()')) + self.jobs.sort() + self.emit(SIGNAL('layoutChanged()')) + + def _job_done(self, job): + self.emit(SIGNAL('layoutAboutToBeChanged()')) + self.jobs.sort() + self.emit(SIGNAL('job_done(int)'), len(self.jobs) - len(self.done_jobs())) + self.emit(SIGNAL('layoutChanged()')) + + def _status_update(self, job): + row = self.jobs.index(job) + self.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), + self.index(row, 0), self.index(row, 3)) + + + def has_device_jobs(self): + for job in self.jobs: + if job.is_running and isinstance(job, DeviceJob): + return True + return False + + def has_jobs(self): + for job in self.jobs: + if job.is_running: + return True + return False + + def run_job(self, done, func, args=[], kwargs={}, + description=None): + job = ParallelJob(func, done, self, args=args, kwargs=kwargs, + description=description) + self.server.add_job(job) + return job + + + def output(self, job): + self.emit(SIGNAL('output_received()')) + + def kill_job(self, row, view): + job = self.jobs[row] + if isinstance(job, DeviceJob): + error_dialog(view, _('Cannot kill job'), + _('Cannot kill jobs that communicate with the device')).exec_() + return + if job.has_run: + error_dialog(view, _('Cannot kill job'), + _('Job has already run')).exec_() + return + if not job.is_running: + error_dialog(view, _('Cannot kill job'), + _('Cannot kill waiting job')).exec_() + return + + + self.server.kill(job) + + def terminate_all_jobs(self): + pass + +class DetailView(QDialog, Ui_Dialog): + + def __init__(self, parent, job): + QDialog.__init__(self, parent) + self.setupUi(self) + self.setWindowTitle(job.description) + self.job = job + self.update() + + + def update(self): + self.log.setHtml(self.job.gui_text()) + vbar = self.log.verticalScrollBar() + vbar.setValue(vbar.maximum()) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 475b20a9c0..f0d168de0b 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -4,13 +4,13 @@ import os, sys, textwrap, collections, traceback, shutil, time from xml.parsers.expat import ExpatError from functools import partial from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \ - QVariant, QThread, QUrl, QSize + QVariant, QUrl, QSize from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ QToolButton, QDialog, QDesktopServices from PyQt4.QtSvg import QSvgRenderer from calibre import __version__, __appname__, islinux, sanitize_file_name, \ - Settings, iswindows, isosx, preferred_encoding + Settings, iswindows, isosx from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat from calibre.devices.errors import FreeSpaceError @@ -18,16 +18,16 @@ from calibre.devices.interface import Device from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ initialize_file_icon_provider, question_dialog,\ pixmap_to_data, choose_dir, ORG_NAME, \ - set_sidebar_directories, \ + set_sidebar_directories, Dispatcher, \ SingleApplication, Application, available_height, max_available_height from calibre.gui2.cover_flow import CoverFlow, DatabaseImages, pictureflowerror from calibre.library.database import LibraryDatabase from calibre.gui2.update import CheckForUpdates from calibre.gui2.main_window import MainWindow, option_parser from calibre.gui2.main_ui import Ui_MainWindow -from calibre.gui2.device import DeviceDetector, DeviceManager +from calibre.gui2.device import DeviceManager from calibre.gui2.status import StatusBar -from calibre.gui2.jobs import JobManager +from calibre.gui2.jobs2 import JobManager from calibre.gui2.news import NewsMenu from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog @@ -44,6 +44,7 @@ from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata import MetaInformation from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.lrf import preferred_source_formats as LRF_PREFERRED_SOURCE_FORMATS +from calibre.parallel import JobKilled class Main(MainWindow, Ui_MainWindow): @@ -72,7 +73,6 @@ class Main(MainWindow, Ui_MainWindow): self.read_settings() self.job_manager = JobManager() self.jobs_dialog = JobsDialog(self, self.job_manager) - self.device_manager = None self.upload_memory = {} self.delete_memory = {} self.conversion_jobs = {} @@ -238,10 +238,8 @@ class Main(MainWindow, Ui_MainWindow): self.setMaximumHeight(max_available_height()) ####################### Setup device detection ######################## - self.detector = DeviceDetector(sleep_time=2000) - QObject.connect(self.detector, SIGNAL('connected(PyQt_PyObject, PyQt_PyObject)'), - self.device_detected, Qt.QueuedConnection) - self.detector.start(QThread.InheritPriority) + self.device_manager = DeviceManager(Dispatcher(self.device_detected), self.job_manager) + self.device_manager.start() self.news_menu.set_custom_feeds(self.library_view.model().db.get_feeds()) @@ -300,22 +298,19 @@ class Main(MainWindow, Ui_MainWindow): ########################## Connect to device ############################## - def device_detected(self, device, connected): + def device_detected(self, connected): ''' Called when a device is connected to the computer. ''' if connected: - self.device_manager = DeviceManager(device) - self.job_manager.run_device_job(self.info_read, self.device_manager.info_func()) - self.set_default_thumbnail(device.THUMBNAIL_HEIGHT) - self.status_bar.showMessage(_('Device: ')+device.__class__.__name__+_(' detected.'), 3000) + self.device_manager.get_device_information(Dispatcher(self.info_read)) + self.set_default_thumbnail(self.device_manager.device.THUMBNAIL_HEIGHT) + self.status_bar.showMessage(_('Device: ')+\ + self.device_manager.device.__class__.__name__+_(' detected.'), 3000) self.action_sync.setEnabled(True) self.device_connected = True else: self.device_connected = False - self.job_manager.terminate_device_jobs() - if self.device_manager: - self.device_manager.device_removed() self.location_view.model().update_devices() self.action_sync.setEnabled(False) self.vanity.setText(self.vanity_template%dict(version=self.latest_version, device=' ')) @@ -324,27 +319,25 @@ class Main(MainWindow, Ui_MainWindow): self.status_bar.reset_info() self.location_selected('library') - def info_read(self, id, description, result, exception, formatted_traceback): + def info_read(self, job): ''' Called once device information has been read. ''' - if exception: - self.device_job_exception(id, description, exception, formatted_traceback) + if job.exception is not None: + self.device_job_exception(job) return - info, cp, fs = result + info, cp, fs = job.result self.location_view.model().update_devices(cp, fs) self.device_info = _('Connected ')+' '.join(info[:-1]) self.vanity.setText(self.vanity_template%dict(version=self.latest_version, device=self.device_info)) - func = self.device_manager.books_func() - self.job_manager.run_device_job(self.metadata_downloaded, func) + self.device_manager.books(Dispatcher(self.metadata_downloaded)) - def metadata_downloaded(self, id, description, result, exception, formatted_traceback): + def metadata_downloaded(self, job): ''' Called once metadata has been read for all books on the device. ''' - if exception: - print exception, type(exception) - if isinstance(exception, ExpatError): + if job.exception is not None: + if isinstance(job.exception, ExpatError): error_dialog(self, _('Device database corrupted'), _('''

                                                                            The database of books on the reader is corrupted. Try the following: @@ -354,9 +347,9 @@ class Main(MainWindow, Ui_MainWindow): ''')%dict(app=__appname__)).exec_() else: - self.device_job_exception(id, description, exception, formatted_traceback) + self.device_job_exception(job) return - mainlist, cardlist = result + mainlist, cardlist = job.result self.memory_view.set_database(mainlist) self.card_view.set_database(cardlist) for view in (self.memory_view, self.card_view): @@ -373,18 +366,17 @@ class Main(MainWindow, Ui_MainWindow): ''' Upload metadata to device. ''' - self.job_manager.run_device_job(self.metadata_synced, - self.device_manager.sync_booklists_func(), - self.booklists()) + self.device_manager.sync_booklists(Dispatcher(self.metadata_synced), + self.booklists()) - def metadata_synced(self, id, description, result, exception, formatted_traceback): + def metadata_synced(self, job): ''' Called once metadata has been uploaded. ''' - if exception: - self.device_job_exception(id, description, exception, formatted_traceback) + if job.exception is not None: + self.device_job_exception(job) return - cp, fs = result + cp, fs = job.result self.location_view.model().update_devices(cp, fs) ############################################################################ @@ -486,35 +478,34 @@ class Main(MainWindow, Ui_MainWindow): def upload_books(self, files, names, metadata, on_card=False, memory=None): ''' Upload books to device. - @param files: List of either paths to files or file like objects + :param files: List of either paths to files or file like objects ''' - titles = ', '.join([i['title'] for i in metadata]) - id = self.job_manager.run_device_job(self.books_uploaded, - self.device_manager.upload_books_func(), + titles = [i['title'] for i in metadata] + job = self.device_manager.upload_books(Dispatcher(self.books_uploaded), files, names, on_card=on_card, - job_extra_description=titles + titles=titles ) - self.upload_memory[id] = (metadata, on_card, memory) + self.upload_memory[job] = (metadata, on_card, memory) - def books_uploaded(self, id, description, result, exception, formatted_traceback): + def books_uploaded(self, job): ''' Called once books have been uploaded. ''' - metadata, on_card, memory = self.upload_memory.pop(id) + metadata, on_card, memory = self.upload_memory.pop(job) - if exception: - if isinstance(exception, FreeSpaceError): - where = 'in main memory.' if 'memory' in str(exception) else 'on the storage card.' + if job.exception is not None: + if isinstance(job.exception, FreeSpaceError): + where = 'in main memory.' if 'memory' in str(job.exception) else 'on the storage card.' titles = '\n'.join(['

                                                                          • '+mi['title']+'
                                                                          • ' for mi in metadata]) d = error_dialog(self, _('No space on device'), _('

                                                                            Cannot upload books to device there is no more free space available ')+where+ '

                                                                            \n
                                                                              %s
                                                                            '%(titles,)) d.exec_() else: - self.device_job_exception(id, description, exception, formatted_traceback) + self.device_job_exception(job) return - self.device_manager.add_books_to_metadata(result, metadata, self.booklists()) + self.device_manager.add_books_to_metadata(job.result, metadata, self.booklists()) self.upload_booklists() @@ -554,22 +545,20 @@ class Main(MainWindow, Ui_MainWindow): self.status_bar.showMessage(_('Deleting books from device.'), 1000) def remove_paths(self, paths): - return self.job_manager.run_device_job(self.books_deleted, - self.device_manager.delete_books_func(), paths) - + return self.device_manager.delete_books(Dispatcher(self.books_deleted), paths) - def books_deleted(self, id, description, result, exception, formatted_traceback): + def books_deleted(self, job): ''' Called once deletion is done on the device ''' for view in (self.memory_view, self.card_view): - view.model().deletion_done(id, bool(exception)) - if exception: - self.device_job_exception(id, description, exception, formatted_traceback) + view.model().deletion_done(id, bool(job.exception)) + if job.exception is not None: + self.device_job_exception(job) return - if self.delete_memory.has_key(id): - paths, model = self.delete_memory.pop(id) + if self.delete_memory.has_key(job): + paths, model = self.delete_memory.pop(job) self.device_manager.remove_books_from_metadata(paths, self.booklists()) model.paths_deleted(paths) self.upload_booklists() @@ -718,12 +707,11 @@ class Main(MainWindow, Ui_MainWindow): QDesktopServices.openUrl(QUrl('file:'+dir)) else: paths = self.current_view().model().paths(rows) - self.job_manager.run_device_job(self.books_saved, - self.device_manager.save_books_func(), paths, dir) - - def books_saved(self, id, description, result, exception, formatted_traceback): - if exception: - self.device_job_exception(id, description, exception, formatted_traceback) + self.device_manager.save_books(Dispatcher(self.books_saved), paths, dir) + + def books_saved(self, job): + if job.exception is not None: + self.device_job_exception(job) return ############################################################################ @@ -746,15 +734,15 @@ class Main(MainWindow, Ui_MainWindow): if data['password']: args.extend(['--password', data['password']]) args.append(data['script'] if data['script'] else data['title']) - id = self.job_manager.run_conversion_job(self.news_fetched, 'feeds2lrf', args=[args], - job_description=_('Fetch news from ')+data['title']) - self.conversion_jobs[id] = (pt, 'lrf') + job = self.job_manager.run_job(Dispatcher(self.news_fetched), 'feeds2lrf', args=[args], + description=_('Fetch news from ')+data['title']) + self.conversion_jobs[job] = (pt, 'lrf') self.status_bar.showMessage(_('Fetching news from ')+data['title'], 2000) - def news_fetched(self, id, description, result, exception, formatted_traceback, log): - pt, fmt = self.conversion_jobs.pop(id) - if exception: - self.conversion_job_exception(id, description, exception, formatted_traceback, log) + def news_fetched(self, job): + pt, fmt = self.conversion_jobs.pop(job) + if job.exception is not None: + self.job_exception(job) return to_device = self.device_connected and fmt in self.device_manager.device_class.FORMATS self._add_books([pt.name], to_device) @@ -828,12 +816,12 @@ class Main(MainWindow, Ui_MainWindow): cmdline.extend(['--cover', cf.name]) cmdline.extend(['-o', of.name]) cmdline.append(pt.name) - id = self.job_manager.run_conversion_job(self.book_converted, + job = self.job_manager.run_job(Dispatcher(self.book_converted), 'any2lrf', args=[cmdline], - job_description=_('Convert book %d of %d (%s)')%(i+1, len(rows), repr(mi.title))) + description=_('Convert book %d of %d (%s)')%(i+1, len(rows), repr(mi.title))) - self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format, + self.conversion_jobs[job] = (d.cover_file, pt, of, d.output_format, self.library_view.model().db.id(row)) res = [] for row in bad_rows: @@ -874,10 +862,10 @@ class Main(MainWindow, Ui_MainWindow): setattr(options, 'output', of.name) options.verbose = 1 args = [pt.name, options] - id = self.job_manager.run_conversion_job(self.book_converted, - 'comic2lrf', args=args, - job_description=_('Convert comic %d of %d (%s)')%(i+1, len(comics), repr(options.title))) - self.conversion_jobs[id] = (None, pt, of, 'lrf', + job = self.job_manager.run_job(Dispatcher(self.book_converted), + 'comic2lrf', args=args, + description=_('Convert comic %d of %d (%s)')%(i+1, len(comics), repr(options.title))) + self.conversion_jobs[job] = (None, pt, of, 'lrf', self.library_view.model().db.id(row)) @@ -904,12 +892,12 @@ class Main(MainWindow, Ui_MainWindow): of.close() cmdline.extend(['-o', of.name]) cmdline.append(pt.name) - id = self.job_manager.run_conversion_job(self.book_converted, - 'any2lrf', args=[cmdline], - job_description=_('Convert book: ')+d.title()) + job = self.job_manager.run_job(Dispatcher(self.book_converted), + 'any2lrf', args=[cmdline], + description=_('Convert book: ')+d.title()) - self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format, d.id) + self.conversion_jobs[job] = (d.cover_file, pt, of, d.output_format, d.id) changed = True if changed: self.library_view.model().resort(reset=False) @@ -949,24 +937,24 @@ class Main(MainWindow, Ui_MainWindow): opts.verbose = 1 args = [pt.name, opts] changed = True - id = self.job_manager.run_conversion_job(self.book_converted, + job = self.job_manager.run_job(Dispatcher(self.book_converted), 'comic2lrf', args=args, - job_description=_('Convert comic: ')+opts.title) - self.conversion_jobs[id] = (None, pt, of, 'lrf', + description=_('Convert comic: ')+opts.title) + self.conversion_jobs[job] = (None, pt, of, 'lrf', self.library_view.model().db.id(row)) if changed: self.library_view.model().resort(reset=False) self.library_view.model().research() - def book_converted(self, id, description, result, exception, formatted_traceback, log): - of, fmt, book_id = self.conversion_jobs.pop(id)[2:] - if exception: - self.conversion_job_exception(id, description, exception, formatted_traceback, log) + def book_converted(self, job): + of, fmt, book_id = self.conversion_jobs.pop(job)[2:] + if job.exception is not None: + self.job_exception(job) return data = open(of.name, 'rb') self.library_view.model().db.add_format(book_id, fmt, data, index_is_id=True) data.close() - self.status_bar.showMessage(description + (' completed'), 2000) + self.status_bar.showMessage(job.description + (' completed'), 2000) #############################View book###################################### @@ -977,19 +965,18 @@ class Main(MainWindow, Ui_MainWindow): self.persistent_files.append(pt) self._view_file(pt.name) - def book_downloaded_for_viewing(self, id, description, result, exception, formatted_traceback): - if exception: - self.device_job_exception(id, description, exception, formatted_traceback) + def book_downloaded_for_viewing(self, job): + if job.exception: + self.device_job_exception(job) return - print result - self._view_file(result) + self._view_file(job.result) def _view_file(self, name): self.setCursor(Qt.BusyCursor) try: if name.upper().endswith('.LRF'): args = ['lrfviewer', name] - self.job_manager.process_server.run_free_job('lrfviewer', kwdargs=dict(args=args)) + self.job_manager.server.run_free_job('lrfviewer', kwdargs=dict(args=args)) else: QDesktopServices.openUrl(QUrl('file:'+name))#launch(name) time.sleep(5) # User feedback @@ -1050,9 +1037,9 @@ class Main(MainWindow, Ui_MainWindow): pt = PersistentTemporaryFile('_viewer_'+os.path.splitext(paths[0])[1]) self.persistent_files.append(pt) pt.close() - self.job_manager.run_device_job(self.book_downloaded_for_viewing, - self.device_manager.view_book_func(), paths[0], pt.name) - + self.device_manager.view_book(Dispatcher(self.book_downloaded_for_viewing), + paths[0], pt.name) + ############################################################################ @@ -1176,72 +1163,40 @@ class Main(MainWindow, Ui_MainWindow): self.action_convert.setEnabled(False) self.view_menu.actions()[1].setEnabled(False) - def device_job_exception(self, id, description, exception, formatted_traceback): + def device_job_exception(self, job): ''' Handle exceptions in threaded device jobs. ''' - if 'Could not read 32 bytes on the control bus.' in str(exception): + if 'Could not read 32 bytes on the control bus.' in str(job.exception): error_dialog(self, _('Error talking to device'), _('There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot.')).show() return - print >>sys.stderr, 'Error in job:', description.encode('utf8') - print >>sys.stderr, exception - print >>sys.stderr, formatted_traceback.encode('utf8') + try: + print >>sys.stderr, job.console_text() + except: + pass if not self.device_error_dialog.isVisible(): - msg = u'

                                                                            %s: '%(exception.__class__.__name__,) + unicode(str(exception), 'utf8', 'replace') + u'

                                                                            ' - msg += u'

                                                                            Failed to perform job: '+description - msg += u'

                                                                            Further device related error messages will not be shown while this message is visible.' - msg += u'

                                                                            Detailed traceback:

                                                                            '
                                                                            -            if isinstance(formatted_traceback, str):
                                                                            -                formatted_traceback = unicode(formatted_traceback, 'utf8', 'replace')
                                                                            -            msg += formatted_traceback
                                                                            -            self.device_error_dialog.set_message(msg)
                                                                            +            self.device_error_dialog.set_message(job.gui_text())
                                                                                         self.device_error_dialog.show()
                                                                                         
                                                                            -    def conversion_job_exception(self, id, description, exception, formatted_traceback, log):
                                                                            +    def job_exception(self, job):
                                                                                     
                                                                            -        def safe_print(msgs, file=sys.stderr):
                                                                            -            for i, msg in enumerate(msgs):
                                                                            -                if not msg:
                                                                            -                    msg = ''
                                                                            -                if isinstance(msg, unicode):
                                                                            -                    msgs[i] = msg.encode(preferred_encoding, 'replace')
                                                                            -            msg = ' '.join(msgs)
                                                                            -            print >>file, msg
                                                                            -        
                                                                            -        def safe_unicode(arg):
                                                                            -            if not arg:
                                                                            -                arg = unicode(repr(arg))
                                                                            -            if isinstance(arg, str):
                                                                            -                arg = arg.decode(preferred_encoding, 'replace')
                                                                            -            if not isinstance(arg, unicode):
                                                                            -                try:
                                                                            -                    arg = unicode(repr(arg))
                                                                            -                except:
                                                                            -                    arg = u'Could not convert to unicode'
                                                                            -            return arg
                                                                            -        
                                                                            -        only_msg = getattr(exception, 'only_msg', False)
                                                                            -        description, exception, formatted_traceback, log = map(safe_unicode,
                                                                            -                            (description, exception, formatted_traceback, log))
                                                                            +        only_msg = getattr(job.exception, 'only_msg', False)
                                                                                     try:
                                                                            -            safe_print('Error in job:', description)
                                                                            -            if log:
                                                                            -                safe_print(log)
                                                                            -            safe_print(exception)
                                                                            -            safe_print(formatted_traceback)
                                                                            +            print job.console_text()
                                                                                     except:
                                                                                         pass
                                                                                     if only_msg:
                                                                            -            error_dialog(self, _('Conversion Error'), exception).exec_()
                                                                            +            try:
                                                                            +                exc = unicode(job.exception)
                                                                            +            except:
                                                                            +                exc = repr(job.exception)
                                                                            +            error_dialog(self, _('Conversion Error'), exc).exec_()
                                                                                         return
                                                                            -        msg =  u'

                                                                            %s:'%exception - msg += u'

                                                                            Failed to perform job: '+description - msg += u'

                                                                            Detailed traceback:

                                                                            '
                                                                            -        msg += formatted_traceback + u'
                                                                            ' - msg += u'

                                                                            Log:

                                                                            '
                                                                            -        msg += log
                                                                            -        ConversionErrorDialog(self, 'Conversion Error', msg, show=True)
                                                                            +        if isinstance(job.exception, JobKilled):
                                                                            +            return
                                                                            +        ConversionErrorDialog(self, _('Conversion Error'), job.gui_text(), 
                                                                            +                              show=True)
                                                                                     
                                                                                 
                                                                                 def read_settings(self):
                                                                            @@ -1294,10 +1249,9 @@ class Main(MainWindow, Ui_MainWindow):
                                                                                         
                                                                                     self.job_manager.terminate_all_jobs()
                                                                                     self.write_settings()
                                                                            -        self.detector.keep_going = False
                                                                            +        self.device_manager.keep_going = False
                                                                                     self.hide()
                                                                                     time.sleep(2)
                                                                            -        self.detector.terminate()
                                                                                     e.accept()
                                                                                     
                                                                                 def update_found(self, version):
                                                                            diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py
                                                                            index 20df329364..1a322f7e31 100644
                                                                            --- a/src/calibre/gui2/status.py
                                                                            +++ b/src/calibre/gui2/status.py
                                                                            @@ -163,24 +163,23 @@ class StatusBar(QStatusBar):
                                                                                 def show_book_info(self):
                                                                                     self.emit(SIGNAL('show_book_info()'))
                                                                                 
                                                                            -    def job_added(self, id):
                                                                            +    def job_added(self, nnum):
                                                                                     jobs = self.movie_button.jobs
                                                                                     src = qstring_to_unicode(jobs.text())
                                                                                     num = self.jobs()
                                                                            -        nnum = num+1
                                                                            +        nnum = num + 1
                                                                                     text = src.replace(str(num), str(nnum))
                                                                                     jobs.setText(text)
                                                                                     if self.movie_button.movie.state() == QMovie.Paused:
                                                                                         self.movie_button.movie.setPaused(False)
                                                                                         
                                                                            -    def job_done(self, id):
                                                                            +    def job_done(self, running):
                                                                                     jobs = self.movie_button.jobs
                                                                                     src = qstring_to_unicode(jobs.text())
                                                                                     num = self.jobs()
                                                                            -        nnum = num-1
                                                                            -        text = src.replace(str(num), str(nnum))
                                                                            +        text = src.replace(str(num), str(running))
                                                                                     jobs.setText(text)
                                                                            -        if nnum == 0:
                                                                            +        if running == 0:
                                                                                         self.no_more_jobs()
                                                                                         
                                                                                 def no_more_jobs(self):
                                                                            diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
                                                                            index 06a85128bd..7fe8a278e8 100644
                                                                            --- a/src/calibre/gui2/widgets.py
                                                                            +++ b/src/calibre/gui2/widgets.py
                                                                            @@ -11,7 +11,7 @@ from PyQt4.QtGui import QListView, QIcon, QFont, QLabel, QListWidget, \
                                                                             from PyQt4.QtCore import QAbstractListModel, QVariant, Qt, SIGNAL, \
                                                                                                      QObject, QRegExp, QString
                                                                             
                                                                            -from calibre.gui2.jobs import DetailView
                                                                            +from calibre.gui2.jobs2 import DetailView
                                                                             from calibre.gui2 import human_readable, NONE, TableView, qstring_to_unicode, error_dialog
                                                                             from calibre.gui2.filename_pattern_ui import Ui_Form
                                                                             from calibre import fit_image, Settings
                                                                            @@ -235,8 +235,10 @@ class JobsView(TableView):
                                                                                     
                                                                                 def show_details(self, index):
                                                                                     row = index.row()
                                                                            -        job = self.model().row_to_job(row)[0]
                                                                            -        DetailView(self, job).exec_()
                                                                            +        job = self.model().row_to_job(row)
                                                                            +        d = DetailView(self, job)
                                                                            +        self.connect(self.model(), SIGNAL('output_received()'), d.update)
                                                                            +        d.exec_()
                                                                                         
                                                                             
                                                                             class FontFamilyModel(QAbstractListModel):
                                                                            diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst
                                                                            index 780de1d85b..f8c4d744db 100644
                                                                            --- a/src/calibre/manual/faq.rst
                                                                            +++ b/src/calibre/manual/faq.rst
                                                                            @@ -17,7 +17,7 @@ E-book Format Conversion
                                                                             
                                                                             What formats does |app| support conversion to/from?
                                                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                            -|app| supports the conversion of the following formats to LRF: HTML, LIT, MOBI, PRC, EPUB, RTF, TXT, PDF and LRS. It also supports the conversion of LRF to LRS and HTML. Note that calibre does not support the conversion of DRMed ebooks.
                                                                            +|app| supports the conversion of the following formats to LRF: HTML, LIT, MOBI, PRC, EPUB, CBR, CBZ, RTF, TXT, PDF and LRS. It also supports the conversion of LRF to LRS and HTML(forthcoming). Note that calibre does not support the conversion of DRMed ebooks.
                                                                             
                                                                             What are the best formats to convert to LRF?
                                                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                            diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py
                                                                            index cde249a779..0a028a16bd 100644
                                                                            --- a/src/calibre/parallel.py
                                                                            +++ b/src/calibre/parallel.py
                                                                            @@ -27,7 +27,6 @@ is buffered and asynchronous to prevent the job from being IO bound.
                                                                             import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, signal, \
                                                                                    subprocess, socket, collections, binascii, re, thread, tempfile
                                                                             from select import select
                                                                            -from functools import partial
                                                                             from threading import RLock, Thread, Event
                                                                             
                                                                             from calibre.ptempfile import PersistentTemporaryFile
                                                                            @@ -334,7 +333,7 @@ class Overseer(object):
                                                                                 def __init__(self, server, port, timeout=5):
                                                                                     self.worker_status = mother.spawn_worker('127.0.0.1:'+str(port))
                                                                                     self.socket = server.accept()[0]
                                                                            -        # Needed if terminate called hwen interpreter is shutting down
                                                                            +        # Needed if terminate called when interpreter is shutting down
                                                                                     self.os = os
                                                                                     self.signal = signal
                                                                                     self.on_probation = False
                                                                            @@ -343,7 +342,6 @@ class Overseer(object):
                                                                                     self.working = False
                                                                                     self.timeout = timeout
                                                                                     self.last_job_time = time.time()
                                                                            -        self.job_id = None
                                                                                     self._stop = False
                                                                                     if not select([self.socket], [], [], 120)[0]:
                                                                                         raise RuntimeError(_('Could not launch worker process.'))
                                                                            @@ -408,16 +406,14 @@ class Overseer(object):
                                                                             
                                                                                     `job`: An instance of :class:`Job`.
                                                                                     '''
                                                                            -        self.job_id = job.job_id
                                                                                     self.working = True
                                                                            -        self.write('JOB:'+cPickle.dumps((job.func, job.args, job.kwdargs), -1))
                                                                            +        self.write('JOB:'+cPickle.dumps((job.func, job.args, job.kwargs), -1))
                                                                                     msg = self.read()
                                                                                     if msg != 'OK':
                                                                                         raise ControlError('Failed to initialize job on worker %d:%s'%(self.worker_pid, msg))
                                                                            -        self.output = job.output if callable(job.output) else sys.stdout.write
                                                                            -        self.progress = job.progress if callable(job.progress) else None
                                                                                     self.job =  job
                                                                                     self.last_report = time.time()
                                                                            +        job.start_work()
                                                                             
                                                                                 def control(self):
                                                                                     '''
                                                                            @@ -435,7 +431,9 @@ class Overseer(object):
                                                                                         else:
                                                                                             if self.on_probation:
                                                                                                 self.terminate()
                                                                            -                    return Result(None, ControlError('Worker process died unexpectedly'), '')
                                                                            +                    self.job.result = None
                                                                            +                    self.job.exception = ControlError('Worker process died unexpectedly')
                                                                            +                    return
                                                                                             else:
                                                                                                 self.on_probation = True
                                                                                                 return
                                                                            @@ -445,13 +443,14 @@ class Overseer(object):
                                                                                             return
                                                                                         elif word == 'RESULT':
                                                                                             self.write('OK')
                                                                            -                return Result(cPickle.loads(msg), None, None)
                                                                            +                self.job.result = cPickle.loads(msg)
                                                                            +                return True
                                                                                         elif word == 'OUTPUT':
                                                                                             self.write('OK')
                                                                                             try:
                                                                            -                    self.output(''.join(cPickle.loads(msg)))
                                                                            +                    self.job.output(''.join(cPickle.loads(msg)))
                                                                                             except:
                                                                            -                    self.output('Bad output message: '+ repr(msg))
                                                                            +                    self.job.output('Bad output message: '+ repr(msg))
                                                                                         elif word == 'PROGRESS':
                                                                                             self.write('OK')
                                                                                             percent = None
                                                                            @@ -459,45 +458,154 @@ class Overseer(object):
                                                                                                 percent, msg = cPickle.loads(msg)[-1]
                                                                                             except:
                                                                                                 print 'Bad progress update:', repr(msg)
                                                                            -                if self.progress and percent is not None:
                                                                            -                    self.progress(percent, msg)
                                                                            +                if percent is not None:
                                                                            +                    self.job.update_status(percent, msg)
                                                                                         elif word == 'ERROR':
                                                                                             self.write('OK')
                                                                            -                return Result(None, *cPickle.loads(msg))
                                                                            +                self.job.excetion, self.job.traceback = cPickle.loads(msg)
                                                                            +                return True
                                                                                         else:
                                                                                             self.terminate()
                                                                            -                return Result(None, ControlError('Worker sent invalid msg: %s'%repr(msg)), '')
                                                                            +                self.job.exception = ControlError('Worker sent invalid msg: %s'%repr(msg))
                                                                            +                return
                                                                                     if not self.worker_status.is_alive() or time.time() - self.last_report > 180:
                                                                                         self.terminate()
                                                                            -            return Result(None, ControlError('Worker process died unexpectedly with returncode: %s'%str(self.process.returncode)), '')
                                                                            +            self.job.exception = ControlError('Worker process died unexpectedly with returncode: %s'%str(self.process.returncode))
                                                                            +            return
                                                                             
                                                                            +class JobKilled(Exception):
                                                                            +    pass
                                                                             
                                                                             class Job(object):
                                                                            +    
                                                                            +    def __init__(self, job_done, job_manager=None, 
                                                                            +                 args=[], kwargs={}, description=None):
                                                                            +        self.args            = args
                                                                            +        self.kwargs          = kwargs
                                                                            +        self._job_done       = job_done
                                                                            +        self.job_manager     = job_manager
                                                                            +        self.is_running      = False
                                                                            +        self.has_run         = False
                                                                            +        self.percent         = -1
                                                                            +        self.msg             = None
                                                                            +        self.description     = description
                                                                            +        self.start_time      = None
                                                                            +        self.running_time    = None
                                                                            +        
                                                                            +        self.result = self.exception = self.traceback = self.log = None
                                                                            +    
                                                                            +    def __cmp__(self, other):
                                                                            +        sstatus, ostatus = self.status(), other.status()
                                                                            +        if sstatus == ostatus or (self.has_run and other.has_run):
                                                                            +            if self.start_time == other.start_time:
                                                                            +                return cmp(id(self), id(other))
                                                                            +            return cmp(self.start_time, other.start_time)
                                                                            +        if sstatus == 'WORKING':
                                                                            +            return -1
                                                                            +        if ostatus == 'WORKING':
                                                                            +            return 1
                                                                            +        if sstatus == 'WAITING':
                                                                            +            return -1
                                                                            +        if ostatus == 'WAITING':
                                                                            +            return 1
                                                                            +        
                                                                            +    
                                                                            +    def job_done(self):
                                                                            +        self.is_running, self.has_run = False, True
                                                                            +        self.running_time = (time.time() - self.start_time) if \
                                                                            +                                    self.start_time is not None else 0
                                                                            +        if self.job_manager is not None:
                                                                            +            self.job_manager.job_done(self)
                                                                            +        self._job_done(self)
                                                                            +        
                                                                            +    def start_work(self):
                                                                            +        self.is_running = True
                                                                            +        self.has_run    = False
                                                                            +        self.start_time = time.time()
                                                                            +        if self.job_manager is not None:
                                                                            +            self.job_manager.start_work(self)
                                                                            +    
                                                                            +    def update_status(self, percent, msg=None):
                                                                            +        self.percent = percent
                                                                            +        self.msg     = msg
                                                                            +        if self.job_manager is not None:
                                                                            +            self.job_manager.status_update(self)
                                                                            +        
                                                                            +    def status(self):
                                                                            +        if self.is_running:
                                                                            +            return 'WORKING'
                                                                            +        if not self.has_run:
                                                                            +            return 'WAITING'
                                                                            +        if self.has_run:
                                                                            +            if self.exception is None:
                                                                            +                return 'DONE'
                                                                            +            return 'ERROR'
                                                                            +            
                                                                            +    def console_text(self):
                                                                            +        ans = [u'Error in job: ']
                                                                            +        if self.description:
                                                                            +            ans[0] += self.description
                                                                            +        if self.log:
                                                                            +            if isinstance(self.log, str):
                                                                            +                self.log = unicode(self.log, 'utf-8', 'replace')
                                                                            +            ans.append(self.log)
                                                                            +        header = unicode(self.exception.__class__.__name__) if \
                                                                            +                hasattr(self.exception, '__class__') else u'Error'
                                                                            +        header += u': '
                                                                            +        try:
                                                                            +            header += unicode(self.exception)
                                                                            +        except:
                                                                            +            header += unicode(repr(self.exception))
                                                                            +        ans.append(header)
                                                                            +        if self.traceback:
                                                                            +            ans.append(self.traceback)
                                                                            +        return (u'\n'.join(ans)).encode('utf-8')
                                                                            +    
                                                                            +    def gui_text(self):
                                                                            +        ans = [u'Job: ']
                                                                            +        if self.description:
                                                                            +            if not isinstance(self.description, unicode):
                                                                            +                self.description = self.description.decode('utf-8', 'replace')
                                                                            +            ans[0] += u'%s'%self.description
                                                                            +        if self.exception is not None:
                                                                            +            header = unicode(self.exception.__class__.__name__) if \
                                                                            +                    hasattr(self.exception, '__class__') else u'Error'
                                                                            +            header = u'%s'%header
                                                                            +            header += u': '
                                                                            +            try:
                                                                            +                header += unicode(self.exception)
                                                                            +            except:
                                                                            +                header += unicode(repr(self.exception))
                                                                            +            ans.append(header)
                                                                            +            if self.traceback:
                                                                            +                ans.append(u'Traceback:')
                                                                            +                ans.extend(self.traceback.split('\n'))
                                                                            +        if self.log:
                                                                            +            ans.append(u'Log:')
                                                                            +            if isinstance(self.log, str):
                                                                            +                self.log = unicode(self.log, 'utf-8', 'replace')
                                                                            +            ans.extend(self.log.split('\n'))
                                                                            +            
                                                                            +        return '
                                                                            '.join(ans) - def __init__(self, job_id, func, args, kwdargs, output, progress, done): - self.job_id = job_id + +class ParallelJob(Job): + + def __init__(self, func, *args, **kwargs): + Job.__init__(self, *args, **kwargs) self.func = func - self.args = args - self.kwdargs = kwdargs - self.output = output - self.progress = progress - self.done = done - -class Result(object): - - def __init__(self, result, exception, traceback): - self.result = result - self.exception = exception - self.traceback = traceback - - def __len__(self): - return 3 - - def __item__(self, i): - return (self.result, self.exception, self.traceback)[i] - - def __iter__(self): - return iter((self.result, self.exception, self.traceback)) + self.done = self.job_done + + def output(self, msg): + if not self.log: + self.log = u'' + if not isinstance(msg, unicode): + msg = msg.decode('utf-8', 'replace') + if msg: + self.log += msg + if self.job_manager is not None: + self.job_manager.output(self) + def remove_ipc_socket(path): os = __import__('os') @@ -527,7 +635,7 @@ class Server(Thread): atexit.register(remove_ipc_socket, self.port) self.server_socket.listen(5) self.number_of_workers = number_of_workers - self.pool, self.jobs, self.working, self.results = [], collections.deque(), [], {} + self.pool, self.jobs, self.working = [], collections.deque(), [] atexit.register(self.killall) atexit.register(self.close) self.job_lock = RLock() @@ -546,16 +654,9 @@ class Server(Thread): def add_job(self, job): with self.job_lock: self.jobs.append(job) - - def store_result(self, result, id=None): - if id: - with self.job_lock: - self.results[id] = result - - def result(self, id): - with self.result_lock: - return self.results.pop(id, None) - + if job.job_manager is not None: + job.job_manager.add_job(job) + def run(self): while True: job = None @@ -577,8 +678,9 @@ class Server(Thread): o.initialize_job(job) except Exception, err: o.terminate() - res = Result(None, unicode(err), traceback.format_exc()) - job.done(res) + job.exception = err + job.traceback = traceback.format_exc() + job.done() o = None if o and o.is_viable(): with self.working_lock: @@ -588,12 +690,14 @@ class Server(Thread): done = [] for o in self.working: try: - res = o.control() + if o.control() is not None or o.job.exception is not None: + o.job.done() + done.append(o) except Exception, err: - res = Result(None, unicode(err), traceback.format_exc()) + o.job.exception = err + o.job.traceback = traceback.format_exc() o.terminate() - if isinstance(res, Result): - o.job.done(res) + o.job.done() done.append(o) for o in done: self.working.remove(o) @@ -613,32 +717,23 @@ class Server(Thread): self.pool = [] - def kill(self, job_id): + def kill(self, job): with self.working_lock: pop = None for o in self.working: - if o.job_id == job_id: - o.terminate() - o.job.done(Result(self.KILL_RESULT, None, '')) + if o.job == job or o == job: + try: + o.terminate() + except: pass + o.job.exception = JobKilled(_('Job stopped by user')) + try: + o.job.done() + except: pass pop = o break if pop is not None: self.working.remove(pop) - - - def run_job(self, job_id, func, args=[], kwdargs={}, - output=None, progress=None, done=None): - ''' - Run a job in a separate process. Supports job control, output redirection - and progress reporting. - ''' - if done is None: - done = partial(self.store_result, id=job_id) - job = Job(job_id, func, args, kwdargs, output, progress, done) - with self.job_lock: - self.jobs.append(job) - def run_free_job(self, func, args=[], kwdargs={}): pt = PersistentTemporaryFile('.pickle', '_IPC_') pt.write(cPickle.dumps((func, args, kwdargs))) @@ -744,7 +839,7 @@ def worker(host, port): if msg != 'OK': return 1 write(client_socket, 'WAITING') - + sys.stdout = BufferedSender(client_socket) sys.stderr = sys.stdout diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 33f24b5a05..dabdd3547d 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -573,7 +573,7 @@ class BasicNewsRecipe(object, LoggingInterface): open(pt.name, 'wb').write(raw) pt.close() url = ('file:'+pt.name) if iswindows else ('file://'+pt.name) - return self._fetch_article(url, dir, logger, f, a, num_of_feeds) + return self._fetch_article(url, dir, logger, f, a, num_of_feeds) def build_index(self): @@ -586,7 +586,7 @@ class BasicNewsRecipe(object, LoggingInterface): feeds = self.parse_feeds() self.report_progress(0, _('Trying to download cover...')) - self.download_cover() + self.download_cover() if self.test: feeds = feeds[:2] self.has_single_feed = len(feeds) == 1 From 1c3a8708146ef0c83d14a60e66490c351ef2ed57 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Aug 2008 12:14:51 -0700 Subject: [PATCH 27/31] Transliterate filenames before saving to device --- src/calibre/gui2/main.py | 10 ++-- src/calibre/gui2/main_window.py | 8 ++- src/calibre/utils/filenames.py | 88 +++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/calibre/utils/filenames.py diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index f0d168de0b..576b4f9a98 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -10,7 +10,7 @@ from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ from PyQt4.QtSvg import QSvgRenderer from calibre import __version__, __appname__, islinux, sanitize_file_name, \ - Settings, iswindows, isosx + Settings, iswindows, isosx, preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat from calibre.devices.errors import FreeSpaceError @@ -45,6 +45,7 @@ from calibre.ebooks.metadata import MetaInformation from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.lrf import preferred_source_formats as LRF_PREFERRED_SOURCE_FORMATS from calibre.parallel import JobKilled +from calibre.utils.filenames import ascii_filename class Main(MainWindow, Ui_MainWindow): @@ -661,10 +662,9 @@ class Main(MainWindow, Ui_MainWindow): if not a: a = 'Unknown' prefix = sanitize_file_name(t+' - '+a) - if isinstance(prefix, unicode): - prefix = prefix.encode('ascii', 'ignore') - else: - prefix = prefix.decode('ascii', 'ignore').encode('ascii', 'ignore') + if not isinstance(prefix, unicode): + prefix = prefix.decode(preferred_encoding, 'replace') + prefix = ascii_filename(prefix) names.append('%s_%d%s'%(prefix, id, os.path.splitext(f)[1])) remove = [self.library_view.model().id(r) for r in rows] if delete_from_library else [] self.upload_books(gf, names, good, on_card, memory=(_files, remove)) diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index c84ce915fe..f9fbeaac3b 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal ' import StringIO, traceback, sys -from PyQt4.Qt import QMainWindow, QString, Qt, QFont +from PyQt4.Qt import QMainWindow, QString, Qt, QFont, QCoreApplication, SIGNAL from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog from calibre import OptionParser @@ -36,11 +36,17 @@ class MainWindow(QMainWindow): def __init__(self, opts, parent=None): QMainWindow.__init__(self, parent) + app = QCoreApplication.instance() + if app is not None: + self.connect(app, SIGNAL('unixSignal(int)'), self.unix_signal) if getattr(opts, 'redirect', False): self.__console_redirect = DebugWindow(self) sys.stdout = sys.stderr = self.__console_redirect self.__console_redirect.show() + def unix_signal(self, signal): + print 'Received signal:', repr(signal) + def unhandled_exception(self, type, value, tb): try: sio = StringIO.StringIO() diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py new file mode 100644 index 0000000000..cf78d64224 --- /dev/null +++ b/src/calibre/utils/filenames.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +''' +Make strings safe for use as ASCII filenames, while trying to preserve as much +meaning as possible. +''' + +import re, string + + +MAP = { + u"‘" : u"'", + u"’" : u"'", + u"«" : u'"', + u"»" : u'"', + u"…" : u"...", + u"№" : u"#", + u"Щ" : u"Sch", + u"Щ" : u"SCH", + u"Ё" : u"Yo", + u"Ё" : u"YO", + u"Ж" : u"Zh", + u"Ж" : u"ZH", + u"Ц" : u"Ts", + u"Ц" : u"TS", + u"Ч" : u"Ch", + u"Ч" : u"CH", + u"Ш" : u"Sh", + u"Ш" : u"SH", + u"Ы" : u"Yi", + u"Ы" : u"YI", + u"Ю" : u"Yu", + u"Ю" : u"YU", + u"Я" : u"Ya", + u"Я" : u"YA", + u"Б" : u"B", + u"Г" : u"G", + u"Д" : u"D", + u"И" : u"I", + u"Й" : u"J", + u"К" : u"K", + u"Л" : u"L", + u"П" : u"P", + u"Ф" : u"F", + u"Э" : u"E", + u"Ъ" : u"`", + u"Ь" : u"'", + u"щ" : u"sch", + u"ё" : u"yo", + u"ж" : u"zh", + u"ц" : u"ts", + u"ч" : u"ch", + u"ш" : u"sh", + u"ы" : u"yi", + u"ю" : u"yu", + u"я" : u"ya", + u"б" : u"b", + u"в" : u"v", + u"г" : u"g", + u"д" : u"d", + u"з" : u"z", + u"и" : u"i", + u"й" : u"j", + u"к" : u"k", + u"л" : u"l", + u"м" : u"m", + u"н" : u"n", + u"о" : u"o", + u"п" : u"p", + u"т" : u"t", + u"ф" : u"f", + u"э" : u"e", + u"ъ" : u"`", + u"ь" : u"'", + } #: Translation table + +for c in string.whitespace: + MAP[c] = ' ' +PAT = re.compile('['+u''.join(MAP.keys())+']') +print repr('['+u''.join(MAP.keys())+']') + +def ascii_filename(orig): + orig = PAT.sub(lambda m:MAP[m.group()], orig) + buf = [] + for i in range(len(orig)): + val = ord(orig[i]) + buf.append('_' if val < 33 or val > 126 else orig[i]) + return (''.join(buf)).encode('ascii') + From 50bb12561b715569613f1643c7f3a590c924db39 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Aug 2008 11:29:12 -0700 Subject: [PATCH 28/31] Fix #946 (comic2lrf doesn't convert manga properly (read right to left)) --- src/calibre/ebooks/lrf/comic/convert_from.py | 10 ++++++---- src/calibre/gui2/dialogs/comicconf.py | 1 + src/calibre/gui2/dialogs/comicconf.ui | 11 +++++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/calibre/ebooks/lrf/comic/convert_from.py b/src/calibre/ebooks/lrf/comic/convert_from.py index a8bc6cbb15..eef7d4cb43 100755 --- a/src/calibre/ebooks/lrf/comic/convert_from.py +++ b/src/calibre/ebooks/lrf/comic/convert_from.py @@ -121,8 +121,8 @@ class PageProcessor(list): DestroyMagickWand(img) MagickCropImage(split1, (width/2)-1, height, 0, 0) MagickCropImage(split2, (width/2)-1, height, width/2, 0 ) - self.pages = [split1, split2] - + self.pages = [split2, split1] if self.opts.right2left else [split1, split2] + self.process_pages() except Exception, err: print 'Failed to process page: %s'%os.path.basename(self.path_to_page) @@ -219,7 +219,7 @@ def process_pages(pages, opts, update): for pp in processed_pages: if len(pp) == 0: - failures.append(os.path.basename(pp.path_to_page())) + failures.append(os.path.basename(pp.path_to_page)) else: ans += pp return ans, failures, tdir @@ -238,7 +238,7 @@ def config(defaults=None): c.add_opt('output', ['-o', '--output'], help=_('Path to output LRF file. By default a file is created in the current directory.')) c.add_opt('colors', ['-c', '--colors'], type='int', default=64, - help=_('Number of colors for Grayscale image conversion. Default: %default')) + help=_('Number of colors for grayscale image conversion. Default: %default')) c.add_opt('dont_normalize', ['-n', '--disable-normalize'], default=False, help=_('Disable normalize (improve contrast) color range for pictures. Default: False')) c.add_opt('keep_aspect_ratio', ['-r', '--keep-aspect-ratio'], default=False, @@ -247,6 +247,8 @@ def config(defaults=None): help=_('Disable sharpening.')) c.add_opt('landscape', ['-l', '--landscape'], default=False, help=_("Don't split landscape images into two portrait images")) + c.add_opt('right2left', ['--right2left'], default=False, action='store_true', + help=_('Used for right-to-left publications like manga. Causes landscape pages to be split into portrait pages from right to left.')) c.add_opt('no_sort', ['--no-sort'], default=False, help=_("Don't sort the files found in the comic alphabetically by name. Instead use the order they were added to the comic.")) c.add_opt('profile', ['-p', '--profile'], default='prs500', choices=PROFILES.keys(), diff --git a/src/calibre/gui2/dialogs/comicconf.py b/src/calibre/gui2/dialogs/comicconf.py index 36043b5224..32bd1547be 100644 --- a/src/calibre/gui2/dialogs/comicconf.py +++ b/src/calibre/gui2/dialogs/comicconf.py @@ -57,6 +57,7 @@ class ComicConf(QDialog, Ui_Dialog): self.opt_dont_sharpen.setChecked(opts.dont_sharpen) self.opt_landscape.setChecked(opts.landscape) self.opt_no_sort.setChecked(opts.no_sort) + self.opt_right2left.setChecked(opts.right2left) for opt in self.config.option_set.preferences: g = getattr(self, 'opt_'+opt.name, False) diff --git a/src/calibre/gui2/dialogs/comicconf.ui b/src/calibre/gui2/dialogs/comicconf.ui index 56d939f787..07df7dc8a8 100644 --- a/src/calibre/gui2/dialogs/comicconf.ui +++ b/src/calibre/gui2/dialogs/comicconf.ui @@ -107,14 +107,14 @@ - + Don't so&rt - + Qt::Horizontal @@ -124,6 +124,13 @@ + + + + &Right to left + + + From cd15edb7bad2966e2636c73b300d12759aad32de Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Aug 2008 13:16:25 -0700 Subject: [PATCH 29/31] IGN:... --- src/calibre/__init__.py | 61 +++++++++++++++++----------------- src/calibre/utils/config.py | 5 +-- src/calibre/utils/filenames.py | 5 --- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index f3ebd37741..b34b760afc 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -327,36 +327,37 @@ def extract(path, dir): extractor(path, dir) def get_proxies(): - proxies = {} - if iswindows: - try: - winreg = __import__('_winreg') - settings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - 'Software\\Microsoft\\Windows' - '\\CurrentVersion\\Internet Settings') - proxy = winreg.QueryValueEx(settings, "ProxyEnable")[0] - if proxy: - server = str(winreg.QueryValueEx(settings, 'ProxyServer')[0]) - if ';' in server: - for p in server.split(';'): - protocol, address = p.split('=') - proxies[protocol] = address - else: - proxies['http'] = server - proxies['ftp'] = server - settings.Close() - except Exception, e: - print('Unable to detect proxy settings: %s' % str(e)) - if proxies: - print('Using proxies: %s' % proxies) - else: - for q in ('http', 'ftp'): - proxy = os.environ.get(q+'_proxy', None) - if not proxy: continue - if proxy.startswith(q+'://'): - proxy = proxy[7:] - proxies[q] = proxy - return proxies + proxies = {} + + for q in ('http', 'ftp'): + proxy = os.environ.get(q+'_proxy', None) + if not proxy: continue + if proxy.startswith(q+'://'): + proxy = proxy[7:] + proxies[q] = proxy + + if iswindows: + try: + winreg = __import__('_winreg') + settings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + 'Software\\Microsoft\\Windows' + '\\CurrentVersion\\Internet Settings') + proxy = winreg.QueryValueEx(settings, "ProxyEnable")[0] + if proxy: + server = str(winreg.QueryValueEx(settings, 'ProxyServer')[0]) + if ';' in server: + for p in server.split(';'): + protocol, address = p.split('=') + proxies[protocol] = address + else: + proxies['http'] = server + proxies['ftp'] = server + settings.Close() + except Exception, e: + print('Unable to detect proxy settings: %s' % str(e)) + if proxies: + print('Using proxies: %s' % proxies) + return proxies def browser(honor_time=False): diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index c7791bb4a0..8191ac402a 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -21,10 +21,11 @@ if iswindows: elif isosx: config_dir = os.path.expanduser('~/Library/Preferences/calibre') else: - config_dir = os.path.expanduser('~/.config/calibre') + bdir = os.path.abspath(os.path.expanduser(os.environ.get('XDG_CONFIG_HOME', '~/.config'))) + config_dir = os.path.join(bdir, 'calibre') if not os.path.exists(config_dir): - os.makedirs(config_dir) + os.makedirs(config_dir, mode=448) # 0700 == 448 class Option(object): diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index cf78d64224..de966b14c9 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -73,11 +73,6 @@ MAP = { u"ь" : u"'", } #: Translation table -for c in string.whitespace: - MAP[c] = ' ' -PAT = re.compile('['+u''.join(MAP.keys())+']') -print repr('['+u''.join(MAP.keys())+']') - def ascii_filename(orig): orig = PAT.sub(lambda m:MAP[m.group()], orig) buf = [] From 4d450f556f52c83d82ed134276f2e830cf0f1fd2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Aug 2008 19:38:35 -0700 Subject: [PATCH 30/31] IGN:Complete migration to new config infrastructure --- setup.py | 2 +- src/calibre/__init__.py | 407 +------------------ src/calibre/constants.py | 30 ++ src/calibre/debug.py | 3 +- src/calibre/ebooks/lit/reader.py | 2 +- src/calibre/ebooks/lrf/__init__.py | 3 +- src/calibre/ebooks/lrf/html/convert_to.py | 3 +- src/calibre/ebooks/lrf/lrfparser.py | 3 +- src/calibre/ebooks/lrf/lrs/convert_from.py | 3 +- src/calibre/ebooks/lrf/meta.py | 4 +- src/calibre/ebooks/lrf/pdf/reflow.py | 3 +- src/calibre/ebooks/metadata/__init__.py | 5 +- src/calibre/ebooks/metadata/isbndb.py | 3 +- src/calibre/ebooks/metadata/library_thing.py | 3 +- src/calibre/ebooks/metadata/meta.py | 12 +- src/calibre/ebooks/mobi/reader.py | 2 +- src/calibre/gui2/__init__.py | 64 ++- src/calibre/gui2/cover_flow.py | 5 +- src/calibre/gui2/dialogs/config.py | 47 ++- src/calibre/gui2/dialogs/fetch_metadata.py | 6 +- src/calibre/gui2/dialogs/lrf_single.py | 10 +- src/calibre/gui2/dialogs/metadata_single.py | 5 +- src/calibre/gui2/dialogs/password.py | 20 +- src/calibre/gui2/library.py | 6 +- src/calibre/gui2/lrf_renderer/main.py | 15 +- src/calibre/gui2/main.py | 62 ++- src/calibre/gui2/main_window.py | 2 +- src/calibre/gui2/widgets.py | 21 +- src/calibre/library/cli.py | 8 +- src/calibre/linux_installer.py | 1 + src/calibre/startup.py | 149 +++++++ src/calibre/translations/pygettext.py | 6 +- src/calibre/utils/config.py | 272 ++++++++++++- src/calibre/utils/lock.py | 86 ++++ src/calibre/web/fetch/simple.py | 3 +- 35 files changed, 735 insertions(+), 541 deletions(-) create mode 100644 src/calibre/constants.py create mode 100644 src/calibre/startup.py create mode 100644 src/calibre/utils/lock.py diff --git a/setup.py b/setup.py index d3be969886..346c9059d5 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ sys.path.append('src') iswindows = re.search('win(32|64)', sys.platform) isosx = 'darwin' in sys.platform islinux = not isosx and not iswindows -src = open('src/calibre/__init__.py', 'rb').read() +src = open('src/calibre/constants.py', 'rb').read() VERSION = re.search(r'__version__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1) APPNAME = re.search(r'__appname__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1) print 'Setup', APPNAME, 'version:', VERSION diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index b34b760afc..6a5da2ac1e 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,123 +1,21 @@ ''' E-book management software''' __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.83' -__docformat__ = "epytext" -__author__ = "Kovid Goyal " -__appname__ = 'calibre' +__copyright__ = '2008, Kovid Goyal ' +__docformat__ = 'restructuredtext en' -import sys, os, logging, mechanize, locale, copy, cStringIO, re, subprocess, \ - textwrap, atexit, cPickle, codecs, time -from gettext import GNUTranslations +import sys, os, re, logging, time, subprocess, mechanize, atexit from htmlentitydefs import name2codepoint from math import floor -from optparse import OptionParser as _OptionParser -from optparse import IndentedHelpFormatter from logging import Formatter -from PyQt4.QtCore import QSettings, QVariant, QUrl, QByteArray, QString -from PyQt4.QtGui import QDesktopServices +from PyQt4.QtCore import QUrl +from PyQt4.QtGui import QDesktopServices +from calibre.startup import plugins, winutil, winutilerror +from calibre.constants import iswindows, isosx, islinux, isfrozen, \ + terminal_controller, preferred_encoding, \ + __appname__, __version__, __author__, \ + win32event, win32api, winerror, fcntl -from calibre.translations.msgfmt import make -from calibre.ebooks.chardet import detect -from calibre.utils.terminfo import TerminalController - -terminal_controller = TerminalController(sys.stdout) -iswindows = 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower() -isosx = 'darwin' in sys.platform.lower() -islinux = not(iswindows or isosx) -isfrozen = hasattr(sys, 'frozen') - -try: - locale.setlocale(locale.LC_ALL, '') -except: - dl = locale.getdefaultlocale() - try: - if dl: - locale.setlocale(dl[0]) - except: - pass - -try: - preferred_encoding = locale.getpreferredencoding() - codecs.lookup(preferred_encoding) -except: - preferred_encoding = 'utf-8' - -if getattr(sys, 'frozen', False): - if iswindows: - plugin_path = os.path.join(os.path.dirname(sys.executable), 'plugins') - elif isosx: - plugin_path = os.path.join(getattr(sys, 'frameworks_dir'), 'plugins') - elif islinux: - plugin_path = os.path.join(getattr(sys, 'frozen_path'), 'plugins') - sys.path.insert(0, plugin_path) -else: - import pkg_resources - plugins = getattr(pkg_resources, 'resource_filename')(__appname__, 'plugins') - sys.path.insert(0, plugins) - -if iswindows and getattr(sys, 'frozen', False): - sys.path.insert(1, os.path.dirname(sys.executable)) - - -plugins = {} -for plugin in ['pictureflow', 'lzx', 'msdes'] + \ - (['winutil'] if iswindows else []) + \ - (['usbobserver'] if isosx else []): - try: - p, err = __import__(plugin), '' - except Exception, err: - p = None - err = str(err) - plugins[plugin] = (p, err) - -if iswindows: - winutil, winutilerror = plugins['winutil'] - if not winutil: - raise RuntimeError('Failed to load the winutil plugin: %s'%winutilerror) - if len(sys.argv) > 1: - sys.argv[1:] = winutil.argv()[1-len(sys.argv):] - win32event = __import__('win32event') - winerror = __import__('winerror') - win32api = __import__('win32api') -else: - import fcntl - -_abspath = os.path.abspath -def my_abspath(path, encoding=sys.getfilesystemencoding()): - ''' - Work around for buggy os.path.abspath. This function accepts either byte strings, - in which it calls os.path.abspath, or unicode string, in which case it first converts - to byte strings using `encoding`, calls abspath and then decodes back to unicode. - ''' - to_unicode = False - if isinstance(path, unicode): - path = path.encode(encoding) - to_unicode = True - res = _abspath(path) - if to_unicode: - res = res.decode(encoding) - return res - -os.path.abspath = my_abspath -_join = os.path.join -def my_join(a, *p): - encoding=sys.getfilesystemencoding() - p = [a] + list(p) - _unicode = False - for i in p: - if isinstance(i, unicode): - _unicode = True - break - p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p] - - res = _join(*p) - if _unicode: - res = res.decode(encoding) - return res - -os.path.join = my_join def unicode_path(path, abs=False): if not isinstance(path, unicode): @@ -135,10 +33,6 @@ def osx_version(): return int(m.group(1)), int(m.group(2)), int(m.group(3)) -# Default translation is NOOP -import __builtin__ -__builtin__.__dict__['_'] = lambda s: s - class CommandLineError(Exception): pass @@ -180,122 +74,6 @@ def setup_cli_handlers(logger, level): logger.addHandler(handler) -class CustomHelpFormatter(IndentedHelpFormatter): - - def format_usage(self, usage): - return _("%sUsage%s: %s\n") % (terminal_controller.BLUE, terminal_controller.NORMAL, usage) - - def format_heading(self, heading): - return "%*s%s%s%s:\n" % (self.current_indent, terminal_controller.BLUE, - "", heading, terminal_controller.NORMAL) - - def format_option(self, option): - result = [] - opts = self.option_strings[option] - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - opts = "%*s%s\n" % (self.current_indent, "", - terminal_controller.GREEN+opts+terminal_controller.NORMAL) - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width + len(terminal_controller.GREEN + terminal_controller.NORMAL), - terminal_controller.GREEN + opts + terminal_controller.NORMAL) - indent_first = 0 - result.append(opts) - if option.help: - help_text = self.expand_default(option).split('\n') - help_lines = [] - - for line in help_text: - help_lines.extend(textwrap.wrap(line, self.help_width)) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) - result.extend(["%*s%s\n" % (self.help_position, "", line) - for line in help_lines[1:]]) - elif opts[-1] != "\n": - result.append("\n") - return "".join(result)+'\n' - -class OptionParser(_OptionParser): - - def __init__(self, - usage='%prog [options] filename', - version='%%prog (%s %s)'%(__appname__, __version__), - epilog=_('Created by ')+terminal_controller.RED+__author__+terminal_controller.NORMAL, - gui_mode=False, - conflict_handler='resolve', - **kwds): - usage += '''\n\nWhenever you pass arguments to %prog that have spaces in them, '''\ - '''enclose the arguments in quotation marks.''' - _OptionParser.__init__(self, usage=usage, version=version, epilog=epilog, - formatter=CustomHelpFormatter(), - conflict_handler=conflict_handler, **kwds) - self.gui_mode = gui_mode - - def error(self, msg): - if self.gui_mode: - raise Exception(msg) - _OptionParser.error(self, msg) - - def merge(self, parser): - ''' - Add options from parser to self. In case of conflicts, confilicting options from - parser are skipped. - ''' - opts = list(parser.option_list) - groups = list(parser.option_groups) - - def merge_options(options, container): - for opt in copy.deepcopy(options): - if not self.has_option(opt.get_opt_string()): - container.add_option(opt) - - merge_options(opts, self) - - for group in groups: - g = self.add_option_group(group.title) - merge_options(group.option_list, g) - - def subsume(self, group_name, msg=''): - ''' - Move all existing options into a subgroup named - C{group_name} with description C{msg}. - ''' - opts = [opt for opt in self.options_iter() if opt.get_opt_string() not in ('--version', '--help')] - self.option_groups = [] - subgroup = self.add_option_group(group_name, msg) - for opt in opts: - self.remove_option(opt.get_opt_string()) - subgroup.add_option(opt) - - def options_iter(self): - for opt in self.option_list: - if str(opt).strip(): - yield opt - for gr in self.option_groups: - for opt in gr.option_list: - if str(opt).strip(): - yield opt - - def option_by_dest(self, dest): - for opt in self.options_iter(): - if opt.dest == dest: - return opt - - def merge_options(self, lower, upper): - ''' - Merge options in lower and upper option lists into upper. - Default values in upper are overriden by - non default values in lower. - ''' - for dest in lower.__dict__.keys(): - if not upper.__dict__.has_key(dest): - continue - opt = self.option_by_dest(dest) - if lower.__dict__[dest] != opt.default and \ - upper.__dict__[dest] == opt.default: - upper.__dict__[dest] = lower.__dict__[dest] - - def load_library(name, cdll): if iswindows: return cdll.LoadLibrary(name) @@ -392,40 +170,6 @@ def fit_image(width, height, pwidth, pheight): return scaled, int(width), int(height) -def get_lang(): - lang = locale.getdefaultlocale()[0] - if lang is None and os.environ.has_key('LANG'): # Needed for OS X - try: - lang = os.environ['LANG'] - except: - pass - if lang: - match = re.match('[a-z]{2,3}', lang) - if match: - lang = match.group() - return lang - -def set_translator(): - # To test different translations invoke as - # LC_ALL=de_DE.utf8 program - try: - from calibre.translations.compiled import translations - except: - return - lang = get_lang() - if lang: - buf = None - if os.access(lang+'.po', os.R_OK): - buf = cStringIO.StringIO() - make(lang+'.po', buf) - buf = cStringIO.StringIO(buf.getvalue()) - elif translations.has_key(lang): - buf = cStringIO.StringIO(translations[lang]) - if buf is not None: - t = GNUTranslations(buf) - t.install(unicode=True) - -set_translator() def sanitize_file_name(name): ''' @@ -510,120 +254,6 @@ def relpath(target, base=os.curdir): rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] return os.path.join(*rel_list) -def _clean_lock_file(file): - try: - file.close() - except: - pass - try: - os.remove(file.name) - except: - pass - -class LockError(Exception): - pass -class ExclusiveFile(object): - - def __init__(self, path, timeout=10): - self.path = path - self.timeout = timeout - - def __enter__(self): - self.file = open(self.path, 'a+b') - self.file.seek(0) - timeout = self.timeout - if iswindows: - name = ('Local\\'+(__appname__+self.file.name).replace('\\', '_'))[:201] - while self.timeout < 0 or timeout >= 0: - self.mutex = win32event.CreateMutex(None, False, name) - if win32api.GetLastError() != winerror.ERROR_ALREADY_EXISTS: break - time.sleep(1) - timeout -= 1 - else: - while self.timeout < 0 or timeout >= 0: - try: - fcntl.lockf(self.file.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) - break - except IOError: - time.sleep(1) - timeout -= 1 - if timeout < 0 and self.timeout >= 0: - self.file.close() - raise LockError - return self.file - - def __exit__(self, type, value, traceback): - self.file.close() - if iswindows: - win32api.CloseHandle(self.mutex) - -def singleinstance(name): - ''' - Return True if no other instance of the application identified by name is running, - False otherwise. - @param name: The name to lock. - @type name: string - ''' - if iswindows: - mutexname = 'mutexforsingleinstanceof'+__appname__+name - mutex = win32event.CreateMutex(None, False, mutexname) - if mutex: - atexit.register(win32api.CloseHandle, mutex) - return not win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS - else: - global _lock_file - path = os.path.expanduser('~/.'+__appname__+'_'+name+'.lock') - try: - f = open(path, 'w') - fcntl.lockf(f.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) - atexit.register(_clean_lock_file, f) - return True - except IOError: - return False - - return False - -class Settings(QSettings): - - def __init__(self, name='calibre2'): - QSettings.__init__(self, QSettings.IniFormat, QSettings.UserScope, - 'kovidgoyal.net', name) - - def get(self, key, default=None): - try: - key = str(key) - if not self.contains(key): - return default - val = str(self.value(key, QVariant()).toByteArray()) - if not val: - return None - return cPickle.loads(val) - except: - return default - - def set(self, key, val): - val = cPickle.dumps(val, -1) - self.setValue(str(key), QVariant(QByteArray(val))) - -_settings = Settings() - -if not _settings.get('rationalized'): - __settings = Settings(name='calibre') - dbpath = os.path.join(os.path.expanduser('~'), 'library1.db').decode(sys.getfilesystemencoding()) - dbpath = unicode(__settings.value('database path', - QVariant(QString.fromUtf8(dbpath.encode('utf-8')))).toString()) - cmdline = __settings.value('LRF conversion defaults', QVariant(QByteArray(''))).toByteArray().data() - - if cmdline: - cmdline = cPickle.loads(cmdline) - _settings.set('LRF conversion defaults', cmdline) - _settings.set('rationalized', True) - try: - os.unlink(unicode(__settings.fileName())) - except: - pass - _settings.set('database path', dbpath) - _spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE) def english_sort(x, y): ''' @@ -671,11 +301,8 @@ def strftime(fmt, t=time.localtime()): A version of strtime that returns unicode strings. ''' result = time.strftime(fmt, t) - try: - return unicode(result, locale.getpreferredencoding(), 'replace') - except: - return unicode(result, 'utf-8', 'replace') - + return unicode(result, preferred_encoding, 'replace') + def entity_to_unicode(match, exceptions=[], encoding='cp1252'): ''' @param match: A match object such that '&'+match.group(1)';' is the entity. @@ -708,7 +335,7 @@ def entity_to_unicode(match, exceptions=[], encoding='cp1252'): return unichr(name2codepoint[ent]) except KeyError: return '&'+ent+';' - + if isosx: fdir = os.path.expanduser('~/.fonts') if not os.path.exists(fdir): @@ -716,6 +343,10 @@ if isosx: if not os.path.exists(os.path.join(fdir, 'LiberationSans_Regular.ttf')): from calibre.ebooks.lrf.fonts.liberation import __all__ as fonts for font in fonts: - exec 'from calibre.ebooks.lrf.fonts.liberation.'+font+' import font_data' - open(os.path.join(fdir, font+'.ttf'), 'wb').write(font_data) + l = {} + exec 'from calibre.ebooks.lrf.fonts.liberation.'+font+' import font_data' in l + open(os.path.join(fdir, font+'.ttf'), 'wb').write(l['font_data']) +# Migrate from QSettings based config system +from calibre.utils.config import migrate +migrate() \ No newline at end of file diff --git a/src/calibre/constants.py b/src/calibre/constants.py new file mode 100644 index 0000000000..f9a2380b41 --- /dev/null +++ b/src/calibre/constants.py @@ -0,0 +1,30 @@ +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' +__appname__ = 'calibre' +__version__ = '0.4.83' +__author__ = "Kovid Goyal " +''' +Various run time constants. +''' + +import sys, locale, codecs +from calibre.utils.terminfo import TerminalController + +terminal_controller = TerminalController(sys.stdout) + +iswindows = 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower() +isosx = 'darwin' in sys.platform.lower() +islinux = not(iswindows or isosx) +isfrozen = hasattr(sys, 'frozen') + +try: + preferred_encoding = locale.getpreferredencoding() + codecs.lookup(preferred_encoding) +except: + preferred_encoding = 'utf-8' + +win32event = __import__('win32event') if iswindows else None +winerror = __import__('winerror') if iswindows else None +win32api = __import__('win32api') if iswindows else None +fcntl = None if iswindows else __import__('fcntl') \ No newline at end of file diff --git a/src/calibre/debug.py b/src/calibre/debug.py index f6f869cdb8..12bc4f8063 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -7,7 +7,8 @@ Embedded console for debugging. ''' import sys, os, re -from calibre import OptionParser, iswindows, isosx +from calibre.utils.config import OptionParser +from calibre.constants import iswindows, isosx from calibre.libunzip import update def option_parser(): diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index b76f6fb4f0..1668d2bc5c 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -808,7 +808,7 @@ class LitReader(object): os.makedirs(dir) def option_parser(): - from calibre import OptionParser + from calibre.utils.config import OptionParser parser = OptionParser(usage=_('%prog [options] LITFILE')) parser.add_option( '-o', '--output-dir', default='.', diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py index 6b724fd008..03d59d825d 100644 --- a/src/calibre/ebooks/lrf/__init__.py +++ b/src/calibre/ebooks/lrf/__init__.py @@ -14,7 +14,8 @@ from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Header, PutObj, \ Paragraph, TextStyle, BlockStyle from calibre.ebooks.lrf.fonts import FONT_FILE_MAP from calibre.ebooks import ConversionError -from calibre import __appname__, __version__, __author__, iswindows, OptionParser +from calibre import __appname__, __version__, __author__, iswindows +from calibre.utils.config import OptionParser __docformat__ = "epytext" diff --git a/src/calibre/ebooks/lrf/html/convert_to.py b/src/calibre/ebooks/lrf/html/convert_to.py index 2fff037abe..a86e4e072e 100644 --- a/src/calibre/ebooks/lrf/html/convert_to.py +++ b/src/calibre/ebooks/lrf/html/convert_to.py @@ -2,7 +2,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import sys, logging, os -from calibre import setup_cli_handlers, OptionParser +from calibre import setup_cli_handlers +from calibre.utils.config import OptionParser from calibre.ebooks import ConversionError from calibre.ebooks.lrf.meta import get_metadata from calibre.ebooks.lrf.lrfparser import LRFDocument diff --git a/src/calibre/ebooks/lrf/lrfparser.py b/src/calibre/ebooks/lrf/lrfparser.py index 0398836788..21d970ab29 100644 --- a/src/calibre/ebooks/lrf/lrfparser.py +++ b/src/calibre/ebooks/lrf/lrfparser.py @@ -4,7 +4,8 @@ __copyright__ = '2008, Kovid Goyal ' import sys, array, os, re, codecs, logging -from calibre import OptionParser, setup_cli_handlers +from calibre import setup_cli_handlers +from calibre.utils.config import OptionParser from calibre.ebooks.lrf.meta import LRFMetaFile from calibre.ebooks.lrf.objects import get_object, PageTree, StyleObject, \ Font, Text, TOCObject, BookAttr, ruby_tags diff --git a/src/calibre/ebooks/lrf/lrs/convert_from.py b/src/calibre/ebooks/lrf/lrs/convert_from.py index 2a065c2fb5..686e8a0839 100644 --- a/src/calibre/ebooks/lrf/lrs/convert_from.py +++ b/src/calibre/ebooks/lrf/lrs/convert_from.py @@ -6,7 +6,8 @@ Compile a LRS file into a LRF file. import sys, os, logging -from calibre import OptionParser, setup_cli_handlers +from calibre import setup_cli_handlers +from calibre.utils.config import OptionParser from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, NavigableString, \ CData, Tag from calibre.ebooks.lrf.pylrs.pylrs import Book, PageStyle, TextStyle, \ diff --git a/src/calibre/ebooks/lrf/meta.py b/src/calibre/ebooks/lrf/meta.py index 80fc542c1c..9996b2be84 100644 --- a/src/calibre/ebooks/lrf/meta.py +++ b/src/calibre/ebooks/lrf/meta.py @@ -574,8 +574,8 @@ class LRFMetaFile(object): def option_parser(): - from optparse import OptionParser - from calibre import __appname__, __version__ + from calibre.utils.config import OptionParser + from calibre.constants import __appname__, __version__ parser = OptionParser(usage = \ _('''%prog [options] mybook.lrf diff --git a/src/calibre/ebooks/lrf/pdf/reflow.py b/src/calibre/ebooks/lrf/pdf/reflow.py index f553aa1b85..87e8837896 100644 --- a/src/calibre/ebooks/lrf/pdf/reflow.py +++ b/src/calibre/ebooks/lrf/pdf/reflow.py @@ -7,7 +7,8 @@ Convert PDF to a reflowable format using pdftoxml.exe as the PDF parsing backend import sys, os, re, tempfile, subprocess, atexit, shutil, logging, xml.parsers.expat from xml.etree.ElementTree import parse -from calibre import isosx, OptionParser, setup_cli_handlers, __appname__ +from calibre import isosx, setup_cli_handlers, __appname__ +from calibre.utils.config import OptionParser from calibre.ebooks import ConversionError PDFTOXML = 'pdftoxml.exe' diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 413e284794..180a07afa8 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -11,8 +11,9 @@ from urllib import unquote, quote from urlparse import urlparse -from calibre import __version__ as VERSION, relpath -from calibre import OptionParser +from calibre.constants import __version__ as VERSION +from calibre import relpath +from calibre.utils.config import OptionParser def get_parser(extension): ''' Return an option parser with the basic metadata options already setup''' diff --git a/src/calibre/ebooks/metadata/isbndb.py b/src/calibre/ebooks/metadata/isbndb.py index ec81684ef2..1f0dde3696 100644 --- a/src/calibre/ebooks/metadata/isbndb.py +++ b/src/calibre/ebooks/metadata/isbndb.py @@ -7,7 +7,8 @@ Interface to isbndb.com. My key HLLXQX2A. import sys, logging, re, socket from urllib import urlopen, quote -from calibre import setup_cli_handlers, OptionParser +from calibre import setup_cli_handlers +from calibre.utils.config import OptionParser from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup diff --git a/src/calibre/ebooks/metadata/library_thing.py b/src/calibre/ebooks/metadata/library_thing.py index 9a254b0613..f93ffafd66 100644 --- a/src/calibre/ebooks/metadata/library_thing.py +++ b/src/calibre/ebooks/metadata/library_thing.py @@ -6,7 +6,8 @@ Fetch cover from LibraryThing.com based on ISBN number. import sys, socket, os, re, mechanize -from calibre import browser as _browser, OptionParser +from calibre import browser as _browser +from calibre.utils.config import OptionParser from calibre.ebooks.BeautifulSoup import BeautifulSoup browser = None diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py index 1c84af8009..4fa0f180be 100644 --- a/src/calibre/ebooks/metadata/meta.py +++ b/src/calibre/ebooks/metadata/meta.py @@ -3,6 +3,7 @@ __copyright__ = '2008, Kovid Goyal ' import os, re, collections +from calibre.utils.config import prefs from calibre.ebooks.metadata.rtf import get_metadata as rtf_metadata from calibre.ebooks.metadata.fb2 import get_metadata as fb2_metadata from calibre.ebooks.lrf.meta import get_metadata as lrf_metadata @@ -94,20 +95,11 @@ def set_metadata(stream, mi, stream_type='lrf'): elif stream_type == 'rtf': set_rtf_metadata(stream, mi) -_filename_pat = re.compile(ur'(?P.+) - (?P<author>[^_]+)') - -def get_filename_pat(): - return _filename_pat.pattern - -def set_filename_pat(pat): - global _filename_pat - _filename_pat = re.compile(pat) - def metadata_from_filename(name, pat=None): name = os.path.splitext(name)[0] mi = MetaInformation(None, None) if pat is None: - pat = _filename_pat + pat = re.compile(prefs.get('filename_pattern')) match = pat.search(name) if match: try: diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 7053b7591f..fccb4f68b4 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -408,7 +408,7 @@ def get_metadata(stream): return mi def option_parser(): - from calibre import OptionParser + from calibre.utils.config import OptionParser parser = OptionParser(usage=_('%prog [options] myebook.mobi')) parser.add_option('-o', '--output-dir', default='.', help=_('Output directory. Defaults to current directory.')) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 8c2b8e51b4..df2596564b 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -2,19 +2,49 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' """ The GUI """ import sys, os, re, StringIO, traceback -from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, \ +from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \ QByteArray, QLocale, QUrl, QTranslator, QCoreApplication from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ QIcon, QTableView, QDialogButtonBox, QApplication ORG_NAME = 'KovidsBrain' APP_UID = 'libprs500' -from calibre import __author__, islinux, iswindows, Settings, isosx, get_lang +from calibre import __author__, islinux, iswindows, isosx +from calibre.startup import get_lang +from calibre.utils.config import Config, ConfigProxy, dynamic import calibre.resources as resources NONE = QVariant() #: Null value to return from the data function of item models - +def _config(): + c = Config('gui', 'preferences for the calibre GUI') + c.add_opt('frequently_used_directories', default=[], + help=_('Frequently used directories')) + c.add_opt('send_to_device_by_default', default=True, + help=_('Send downloaded periodical content to device automatically')) + c.add_opt('save_to_disk_single_format', default='lrf', + help=_('The format to use when saving single files to disk')) + c.add_opt('confirm_delete', default=False, + help=_('Confirm before deleting')) + c.add_opt('toolbar_icon_size', default=QSize(48, 48), + help=_('Toolbar icon size')) # value QVariant.toSize + c.add_opt('show_text_in_toolbar', default=True, + help=_('Show button labels in the toolbar')) + c.add_opt('main_window_geometry', default=None, + help=_('Main window geometry')) # value QVariant.toByteArray + c.add_opt('new_version_notification', default=True, + help=_('Notify when a new version is available')) + c.add_opt('use_roman_numerals_for_series_number', default=True, + help=_('Use Roman numerals for series number')) + c.add_opt('cover_flow_queue_length', default=6, + help=_('Number of covers to show in the cover browsing mode')) + c.add_opt('LRF_conversion_defaults', default=[], + help=_('Defaults for conversion to LRF')) + c.add_opt('LRF_ebook_viewer_options', default=None, + help=_('Options for the LRF ebook viewer')) + return ConfigProxy(c) + +config = _config() # Turn off DeprecationWarnings in windows GUI if iswindows: import warnings @@ -105,14 +135,12 @@ class TableView(QTableView): QTableView.__init__(self, parent) self.read_settings() - def read_settings(self): - self.cw = Settings().get(self.__class__.__name__ + ' column widths') + self.cw = dynamic[self.__class__.__name__+'column widths'] def write_settings(self): - settings = Settings() - settings.set(self.__class__.__name__ + ' column widths', - tuple([int(self.columnWidth(i)) for i in range(self.model().columnCount(None))])) + dynamic[self.__class__.__name__+'column widths'] = \ + tuple([int(self.columnWidth(i)) for i in range(self.model().columnCount(None))]) def restore_column_widths(self): if self.cw and len(self.cw): @@ -125,10 +153,11 @@ class TableView(QTableView): @param cols: A list of booleans or None. If an entry is False the corresponding column is hidden, if True it is shown. ''' + key = self.__class__.__name__+'visible columns' if cols: - Settings().set(self.__class__.__name__ + ' visible columns', cols) + dynamic[key] = cols else: - cols = Settings().get(self.__class__.__name__ + ' visible columns') + cols = dynamic[key] if not cols: cols = [True for i in range(self.model().columnCount(self))] @@ -232,7 +261,7 @@ _sidebar_directories = [] def set_sidebar_directories(dirs): global _sidebar_directories if dirs is None: - dirs = Settings().get('frequently used directories', []) + dirs = config['frequently_used_directories'] _sidebar_directories = [QUrl.fromLocalFile(i) for i in dirs] class FileDialog(QObject): @@ -255,10 +284,10 @@ class FileDialog(QObject): if add_all_files_filter or not ftext: ftext += 'All files (*)' - settings = Settings() self.dialog_name = name if name else 'dialog_' + title self.selected_files = None self.fd = None + if islinux: self.fd = QFileDialog(parent) self.fd.setFileMode(mode) @@ -266,15 +295,15 @@ class FileDialog(QObject): self.fd.setModal(modal) self.fd.setFilter(ftext) self.fd.setWindowTitle(title) - state = settings.get(self.dialog_name, QByteArray()) - if not self.fd.restoreState(state): + state = dynamic[self.dialog_name] + if not state or not self.fd.restoreState(state): self.fd.setDirectory(os.path.expanduser('~')) osu = [i for i in self.fd.sidebarUrls()] self.fd.setSidebarUrls(osu + _sidebar_directories) QObject.connect(self.fd, SIGNAL('accepted()'), self.save_dir) self.accepted = self.fd.exec_() == QFileDialog.Accepted else: - dir = settings.get(self.dialog_name, os.path.expanduser('~')) + dir = dynamic.get(self.dialog_name, default=os.path.expanduser('~')) self.selected_files = [] if mode == QFileDialog.AnyFile: f = qstring_to_unicode( @@ -299,7 +328,7 @@ class FileDialog(QObject): self.selected_files.append(f) if self.selected_files: self.selected_files = [qstring_to_unicode(q) for q in self.selected_files] - settings.set(self.dialog_name, os.path.dirname(self.selected_files[0])) + dynamic[self.dialog_name] = os.path.dirname(self.selected_files[0]) self.accepted = bool(self.selected_files) @@ -313,8 +342,7 @@ class FileDialog(QObject): def save_dir(self): if self.fd: - settings = Settings() - settings.set(self.dialog_name, self.fd.saveState()) + dynamic[self.dialog_name] = self.fd.saveState() def choose_dir(window, name, title): diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 3a40e03200..196e723be7 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -12,7 +12,8 @@ import sys, os from PyQt4.QtGui import QImage, QSizePolicy from PyQt4.QtCore import Qt, QSize, SIGNAL, QObject -from calibre import Settings, plugins +from calibre import plugins +from calibre.gui2 import config pictureflow, pictureflowerror = plugins['pictureflow'] if pictureflow is not None: @@ -70,7 +71,7 @@ if pictureflow is not None: def __init__(self, height=300, parent=None): pictureflow.PictureFlow.__init__(self, parent, - Settings().get('cover flow queue length', 6)+1) + config['cover_flow_queue_length']+1) self.setSlideSize(QSize(int(2/3. * height), height)) self.setMinimumSize(QSize(int(2.35*0.67*height), (5/3.)*height+25)) self.setFocusPolicy(Qt.WheelFocus) diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py index e4379deb56..c84c3a3713 100644 --- a/src/calibre/gui2/dialogs/config.py +++ b/src/calibre/gui2/dialogs/config.py @@ -5,9 +5,10 @@ import os from PyQt4.QtGui import QDialog, QMessageBox, QListWidgetItem, QIcon from PyQt4.QtCore import SIGNAL, QTimer, Qt, QSize, QVariant -from calibre import islinux, Settings +from calibre import islinux from calibre.gui2.dialogs.config_ui import Ui_Dialog -from calibre.gui2 import qstring_to_unicode, choose_dir, error_dialog +from calibre.gui2 import qstring_to_unicode, choose_dir, error_dialog, config +from calibre.utils.config import prefs from calibre.gui2.widgets import FilenamePattern from calibre.ebooks import BOOK_EXTENSIONS @@ -24,18 +25,17 @@ class ConfigDialog(QDialog, Ui_Dialog): self.item2 = QListWidgetItem(QIcon(':/images/view.svg'), _('Advanced'), self.category_list) self.db = db self.current_cols = columns - settings = Settings() - path = settings.get('database path') + path = prefs['database_path'] self.location.setText(os.path.dirname(path)) self.connect(self.browse_button, SIGNAL('clicked(bool)'), self.browse) self.connect(self.compact_button, SIGNAL('clicked(bool)'), self.compact) - dirs = settings.get('frequently used directories', []) - rn = settings.get('use roman numerals for series number', True) - self.timeout.setValue(settings.get('network timeout', 5)) + dirs = config['frequently_used_directories'] + rn = config['use_roman_numerals_for_series_number'] + self.timeout.setValue(prefs['network_timeout']) self.roman_numerals.setChecked(rn) - self.new_version_notification.setChecked(settings.get('new version notification', True)) + self.new_version_notification.setChecked(config['new_version_notification']) self.directory_list.addItems(dirs) self.connect(self.add_button, SIGNAL('clicked(bool)'), self.add_dir) self.connect(self.remove_button, SIGNAL('clicked(bool)'), self.remove_dir) @@ -57,17 +57,17 @@ class ConfigDialog(QDialog, Ui_Dialog): self.filename_pattern = FilenamePattern(self) self.metadata_box.layout().insertWidget(0, self.filename_pattern) - icons = settings.get('toolbar icon size', self.ICON_SIZES[0]) + icons = config['toolbar_icon_size'] self.toolbar_button_size.setCurrentIndex(0 if icons == self.ICON_SIZES[0] else 1 if icons == self.ICON_SIZES[1] else 2) - self.show_toolbar_text.setChecked(settings.get('show text in toolbar', True)) + self.show_toolbar_text.setChecked(config['show_text_in_toolbar']) for ext in BOOK_EXTENSIONS: self.single_format.addItem(ext.upper(), QVariant(ext)) - single_format = settings.get('save to disk single format', 'lrf') + single_format = config['save_to_disk_single_format'] self.single_format.setCurrentIndex(BOOK_EXTENSIONS.index(single_format)) - self.cover_browse.setValue(settings.get('cover flow queue length', 6)) - self.confirm_delete.setChecked(settings.get('confirm delete', False)) + self.cover_browse.setValue(config['cover_flow_queue_length']) + self.confirm_delete.setChecked(config['confirm_delete']) def compact(self, toggled): d = Vacuum(self, self.db) @@ -89,19 +89,18 @@ class ConfigDialog(QDialog, Ui_Dialog): self.directory_list.takeItem(idx) def accept(self): - settings = Settings() - settings.set('use roman numerals for series number', bool(self.roman_numerals.isChecked())) - settings.set('new version notification', bool(self.new_version_notification.isChecked())) - settings.set('network timeout', int(self.timeout.value())) + config['use_roman_numerals_for_series_number'] = bool(self.roman_numerals.isChecked()) + config['new_version_notification'] = bool(self.new_version_notification.isChecked()) + prefs['network_timeout'] = int(self.timeout.value()) path = qstring_to_unicode(self.location.text()) self.final_columns = [self.columns.item(i).checkState() == Qt.Checked for i in range(self.columns.count())] - settings.set('toolbar icon size', self.ICON_SIZES[self.toolbar_button_size.currentIndex()]) - settings.set('show text in toolbar', bool(self.show_toolbar_text.isChecked())) - settings.set('confirm delete', bool(self.confirm_delete.isChecked())) + config['toolbar_icon_size'] = self.ICON_SIZES[self.toolbar_button_size.currentIndex()] + config['show_text_in_toolbar'] = bool(self.show_toolbar_text.isChecked()) + config['confirm_delete'] = bool(self.confirm_delete.isChecked()) pattern = self.filename_pattern.commit() - settings.set('filename pattern', pattern) - settings.set('save to disk single format', BOOK_EXTENSIONS[self.single_format.currentIndex()]) - settings.set('cover flow queue length', self.cover_browse.value()) + config['filename_pattern'] = pattern + config['save_to_disk_single_format'] = BOOK_EXTENSIONS[self.single_format.currentIndex()] + config['cover_flow_queue_length'] = self.cover_browse.value() if not path or not os.path.exists(path) or not os.path.isdir(path): d = error_dialog(self, _('Invalid database location'), _('Invalid database location ')+path+_('<br>Must be a directory.')) @@ -112,7 +111,7 @@ class ConfigDialog(QDialog, Ui_Dialog): else: self.database_location = os.path.abspath(path) self.directories = [qstring_to_unicode(self.directory_list.item(i).text()) for i in range(self.directory_list.count())] - settings.set('frequently used directories', self.directories) + config['frequently_used_directories'] = self.directories QDialog.accept(self) class Vacuum(QMessageBox): diff --git a/src/calibre/gui2/dialogs/fetch_metadata.py b/src/calibre/gui2/dialogs/fetch_metadata.py index f905e72e81..76a5979f9e 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.py +++ b/src/calibre/gui2/dialogs/fetch_metadata.py @@ -13,7 +13,7 @@ from PyQt4.QtGui import QDialog, QItemSelectionModel from calibre.gui2.dialogs.fetch_metadata_ui import Ui_FetchMetadata from calibre.gui2 import error_dialog, NONE, info_dialog from calibre.ebooks.metadata.isbndb import create_books, option_parser, ISBNDBError -from calibre import Settings +from calibre.utils.config import prefs class Matches(QAbstractTableModel): @@ -76,7 +76,7 @@ class FetchMetadata(QDialog, Ui_FetchMetadata): self.timeout = timeout QObject.connect(self.fetch, SIGNAL('clicked()'), self.fetch_metadata) - self.key.setText(Settings().get('isbndb.com key', '')) + self.key.setText(prefs['isbndb_com_key']) self.setWindowTitle(title if title else 'Unknown') self.tlabel.setText(self.tlabel.text().arg(title if title else 'Unknown')) @@ -105,7 +105,7 @@ class FetchMetadata(QDialog, Ui_FetchMetadata): _('You must specify a valid access key for isbndb.com')) return else: - Settings().set('isbndb.com key', key) + prefs['isbndb_com_key'] = key args = ['isbndb'] if self.isbn: diff --git a/src/calibre/gui2/dialogs/lrf_single.py b/src/calibre/gui2/dialogs/lrf_single.py index e8f3d61b7c..787df4d080 100644 --- a/src/calibre/gui2/dialogs/lrf_single.py +++ b/src/calibre/gui2/dialogs/lrf_single.py @@ -9,11 +9,11 @@ from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, \ from calibre.gui2.dialogs.lrf_single_ui import Ui_LRFSingleDialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.gui2 import qstring_to_unicode, error_dialog, \ - pixmap_to_data, choose_images + pixmap_to_data, choose_images, config from calibre.gui2.widgets import FontFamilyModel from calibre.ebooks.lrf import option_parser from calibre.ptempfile import PersistentTemporaryFile -from calibre import __appname__, Settings +from calibre.constants import __appname__ font_family_model = None @@ -109,7 +109,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): def load_saved_global_defaults(self): - cmdline = Settings().get('LRF conversion defaults') + cmdline = config['LRF_conversion_defaults'] if cmdline: self.set_options_from_cmdline(cmdline) @@ -163,7 +163,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): def select_cover(self, checked): files = choose_images(self, 'change cover dialog', - u'Choose cover for ' + qstring_to_unicode(self.gui_title.text())) + _('Choose cover for ') + qstring_to_unicode(self.gui_title.text())) if not files: return _file = files[0] @@ -385,7 +385,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): cmdline.extend([u'--cover', self.cover_file.name]) self.cmdline = [unicode(i) for i in cmdline] else: - Settings().set('LRF conversion defaults', cmdline) + config.set('LRF_conversion_defaults', cmdline) QDialog.accept(self) class LRFBulkDialog(LRFSingleDialog): diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 14baa0de91..fa6ea780d2 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -18,7 +18,8 @@ from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.dialogs.password import PasswordDialog from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.library_thing import login, cover_from_isbn, LibraryThingError -from calibre import Settings, islinux +from calibre import islinux +from calibre.utils.config import prefs class Format(QListWidgetItem): def __init__(self, parent, ext, size, path=None): @@ -145,7 +146,7 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog): QObject.connect(self.remove_series_button, SIGNAL('clicked()'), self.remove_unused_series) self.connect(self.swap_button, SIGNAL('clicked()'), self.swap_title_author) - self.timeout = float(Settings().get('network timeout', 5)) + self.timeout = float(prefs['network_timeout']) self.title.setText(db.title(row)) isbn = db.isbn(self.id, index_is_id=True) if not isbn: diff --git a/src/calibre/gui2/dialogs/password.py b/src/calibre/gui2/dialogs/password.py index 9248f313d4..31e01a25cf 100644 --- a/src/calibre/gui2/dialogs/password.py +++ b/src/calibre/gui2/dialogs/password.py @@ -1,12 +1,11 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' - +import re from PyQt4.QtGui import QDialog, QLineEdit -from PyQt4.QtCore import QVariant, SIGNAL, Qt +from PyQt4.QtCore import SIGNAL, Qt from calibre.gui2.dialogs.password_ui import Ui_Dialog -from calibre.gui2 import qstring_to_unicode -from calibre import Settings +from calibre.gui2 import qstring_to_unicode, dynamic class PasswordDialog(QDialog, Ui_Dialog): @@ -14,10 +13,12 @@ class PasswordDialog(QDialog, Ui_Dialog): QDialog.__init__(self, window) Ui_Dialog.__init__(self) self.setupUi(self) + self.cfg_key = re.sub(r'[^0-9a-zA-Z]', '_', name) - settings = Settings() - un = settings.get(name+': un', u'') - pw = settings.get(name+': pw', u'') + un = dynamic[self.cfg_key+'__un'] + pw = dynamic[self.cfg_key+'__un'] + if not un: un = '' + if not pw: pw = '' self.gui_username.setText(un) self.gui_password.setText(pw) self.sname = name @@ -37,7 +38,6 @@ class PasswordDialog(QDialog, Ui_Dialog): return qstring_to_unicode(self.gui_password.text()) def accept(self): - settings = Settings() - settings.set(self.sname+': un', unicode(self.gui_username.text())) - settings.set(self.sname+': pw', unicode(self.gui_password.text())) + dynamic.set(self.cfg_key+'__un', unicode(self.gui_username.text())) + dynamic.set(self.cfg_key+'__pw', unicode(self.gui_password.text())) QDialog.accept(self) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 76527c3034..24ccc46707 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -14,10 +14,10 @@ from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt, QString, \ QCoreApplication, SIGNAL, QObject, QSize, QModelIndex, \ QTimer -from calibre import Settings, preferred_encoding +from calibre import preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.library.database import LibraryDatabase, text_to_tokens -from calibre.gui2 import NONE, TableView, qstring_to_unicode +from calibre.gui2 import NONE, TableView, qstring_to_unicode, config class LibraryDelegate(QItemDelegate): COLOR = QColor("blue") @@ -117,7 +117,7 @@ class BooksModel(QAbstractTableModel): self.load_queue = deque() def read_config(self): - self.use_roman_numbers = Settings().get('use roman numerals for series number', True) + self.use_roman_numbers = config['use_roman_numerals_for_series_number'] def set_database(self, db): diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 2fc4222a8f..8e3b805f7a 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -6,10 +6,11 @@ import sys, logging, os, traceback, time from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread -from calibre import __appname__, setup_cli_handlers, islinux, Settings +from calibre import __appname__, setup_cli_handlers, islinux from calibre.ebooks.lrf.lrfparser import LRFDocument -from calibre.gui2 import ORG_NAME, APP_UID, error_dialog, choose_files, Application +from calibre.gui2 import ORG_NAME, APP_UID, error_dialog, \ + config, choose_files, Application from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog from calibre.gui2.lrf_renderer.main_ui import Ui_MainWindow from calibre.gui2.lrf_renderer.config_ui import Ui_ViewerConfig @@ -102,13 +103,15 @@ class Main(MainWindow, Ui_MainWindow): def configure(self, triggered): - opts = Settings().get('LRF ebook viewer options', self.opts) + opts = config['LRF_ebook_viewer_options'] + if not opts: + opts = self.opts d = Config(self, opts) d.exec_() if d.result() == QDialog.Accepted: opts.white_background = bool(d.white_background.isChecked()) opts.hyphenate = bool(d.hyphenate.isChecked()) - Settings().set('LRF ebook viewer options', opts) + config['LRF_ebook_viewer_options'] = opts def set_ebook(self, stream): self.progress_bar.setMinimum(0) @@ -281,7 +284,9 @@ Read the LRF ebook book.lrf return parser def normalize_settings(parser, opts): - saved_opts = Settings().get('LRF ebook viewer options', opts) + saved_opts = config['LRF_ebook_viewer_options'] + if not saved_opts: + saved_opts = opts for opt in parser.option_list: if not opt.dest: continue diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 576b4f9a98..96c8c8d9a4 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -3,23 +3,24 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' import os, sys, textwrap, collections, traceback, shutil, time from xml.parsers.expat import ExpatError from functools import partial -from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \ - QVariant, QUrl, QSize +from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, QUrl from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ QToolButton, QDialog, QDesktopServices from PyQt4.QtSvg import QSvgRenderer from calibre import __version__, __appname__, islinux, sanitize_file_name, \ - Settings, iswindows, isosx, preferred_encoding + iswindows, isosx, preferred_encoding from calibre.ptempfile import PersistentTemporaryFile -from calibre.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat +from calibre.ebooks.metadata.meta import get_metadata from calibre.devices.errors import FreeSpaceError from calibre.devices.interface import Device +from calibre.utils.config import prefs, dynamic from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ initialize_file_icon_provider, question_dialog,\ pixmap_to_data, choose_dir, ORG_NAME, \ set_sidebar_directories, Dispatcher, \ - SingleApplication, Application, available_height, max_available_height + SingleApplication, Application, available_height, \ + max_available_height, config from calibre.gui2.cover_flow import CoverFlow, DatabaseImages, pictureflowerror from calibre.library.database import LibraryDatabase from calibre.gui2.update import CheckForUpdates @@ -120,12 +121,12 @@ class Main(MainWindow, Ui_MainWindow): sm.addAction(_('Send to storage card by default')) sm.actions()[-1].setCheckable(True) def default_sync(checked): - Settings().set('send to device by default', bool(checked)) + config.set('send_to_device_by_default', bool(checked)) QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card) QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card if checked else self.sync_to_main_memory) QObject.connect(sm.actions()[-1], SIGNAL('toggled(bool)'), default_sync) - sm.actions()[-1].setChecked(Settings().get('send to device by default', False)) + sm.actions()[-1].setChecked(config.get('send_to_device_by_default')) default_sync(sm.actions()[-1].isChecked()) self.sync_menu = sm # Needed md = QMenu() @@ -152,7 +153,7 @@ class Main(MainWindow, Ui_MainWindow): self.save_menu = QMenu() self.save_menu.addAction(_('Save to disk')) self.save_menu.addAction(_('Save to disk in a single directory')) - self.save_menu.addAction(_('Save only %s format to disk')%Settings().get('save to disk single format', 'lrf').upper()) + self.save_menu.addAction(_('Save only %s format to disk')%config.get('save_to_disk_single_format').upper()) self.view_menu = QMenu() self.view_menu.addAction(_('View')) @@ -529,7 +530,7 @@ class Main(MainWindow, Ui_MainWindow): rows = view.selectionModel().selectedRows() if not rows or len(rows) == 0: return - if Settings().get('confirm delete', False): + if config['confirm_delete']: d = question_dialog(self, _('Confirm delete'), _('Are you sure you want to delete these %d books?')%len(rows)) if d.exec_() != QMessageBox.Yes: @@ -680,7 +681,7 @@ class Main(MainWindow, Ui_MainWindow): ############################## Save to disk ################################ def save_single_format_to_disk(self, checked): - self.save_to_disk(checked, True, Settings().get('save to disk single format', 'lrf')) + self.save_to_disk(checked, True, config['save_to_disk_single_format']) def save_to_single_dir(self, checked): self.save_to_disk(checked, True) @@ -1067,9 +1068,8 @@ class Main(MainWindow, Ui_MainWindow): d.exec_() if d.result() == d.Accepted: self.library_view.set_visible_columns(d.final_columns) - settings = Settings() - self.tool_bar.setIconSize(settings.value('toolbar icon size', QVariant(QSize(48, 48))).toSize()) - self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon if settings.get('show text in toolbar', True) else Qt.ToolButtonIconOnly) + self.tool_bar.setIconSize(config['toolbar_icon_size']) + self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon if config['show_text_in_toolbar'] else Qt.ToolButtonIconOnly) if os.path.dirname(self.database_path) != d.database_location: try: @@ -1100,8 +1100,7 @@ class Main(MainWindow, Ui_MainWindow): d.exec_() newloc = self.database_path self.database_path = newloc - settings = Settings() - settings.set('database path', self.database_path) + prefs().set('database_path', self.database_path) except Exception, err: traceback.print_exc() d = error_dialog(self, _('Could not move database'), unicode(err)) @@ -1200,12 +1199,10 @@ class Main(MainWindow, Ui_MainWindow): def read_settings(self): - settings = Settings() - settings.beginGroup('Main Window') - geometry = settings.value('main window geometry', QVariant()).toByteArray() - self.restoreGeometry(geometry) - settings.endGroup() - self.database_path = settings.get('database path') + geometry = config['main_window_geometry'] + if geometry is not None: + self.restoreGeometry(geometry) + self.database_path = prefs['database_path'] if not os.access(os.path.dirname(self.database_path), os.W_OK): error_dialog(self, _('Database does not exist'), _('The directory in which the database should be: %s no longer exists. Please choose a new database location.')%self.database_path).exec_() self.database_path = choose_dir(self, 'database path dialog', 'Choose new location for database') @@ -1214,24 +1211,18 @@ class Main(MainWindow, Ui_MainWindow): if not os.path.exists(self.database_path): os.makedirs(self.database_path) self.database_path = os.path.join(self.database_path, 'library1.db') - settings.set('database path', self.database_path) + prefs.set('database_path', self.database_path) set_sidebar_directories(None) - set_filename_pat(settings.get('filename pattern', get_filename_pat())) - self.tool_bar.setIconSize(settings.get('toolbar icon size', QSize(48, 48))) - self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon if settings.get('show text in toolbar', True) else Qt.ToolButtonIconOnly) + self.tool_bar.setIconSize(config['toolbar_icon_size']) + self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon if config['show_text_in_toolbar'] else Qt.ToolButtonIconOnly) def write_settings(self): - settings = Settings() - settings.beginGroup("Main Window") - settings.setValue("main window geometry", QVariant(self.saveGeometry())) - settings.endGroup() - settings.beginGroup('Book Views') + config.set('main_window_geometry', self.saveGeometry()) self.library_view.write_settings() if self.device_connected: self.memory_view.write_settings() - settings.endGroup() - + def closeEvent(self, e): msg = 'There are active jobs. Are you sure you want to quit?' if self.job_manager.has_device_jobs(): @@ -1261,17 +1252,16 @@ class Main(MainWindow, Ui_MainWindow): self.vanity.setText(self.vanity_template%(dict(version=self.latest_version, device=self.device_info))) self.vanity.update() - s = Settings() - if s.get('new version notification', True) and s.get('update to version %s'%version, True): + if config.get('new_version_notification') and dynamic.get('update to version %s'%version, True): d = question_dialog(self, _('Update available'), _('%s has been updated to version %s. See the <a href="http://calibre.kovidgoyal.net/wiki/Changelog">new features</a>. Visit the download page?')%(__appname__, version)) if d.exec_() == QMessageBox.Yes: url = 'http://calibre.kovidgoyal.net/download_'+('windows' if iswindows else 'osx' if isosx else 'linux') QDesktopServices.openUrl(QUrl(url)) - s.set('update to version %s'%version, False) + dynamic.set('update to version %s'%version, False) def main(args=sys.argv): - from calibre import singleinstance + from calibre.utils.lock import singleinstance pid = os.fork() if False and islinux else -1 if pid <= 0: diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index f9fbeaac3b..db9cdd389d 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -5,7 +5,7 @@ import StringIO, traceback, sys from PyQt4.Qt import QMainWindow, QString, Qt, QFont, QCoreApplication, SIGNAL from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog -from calibre import OptionParser +from calibre.utils.config import OptionParser def option_parser(usage='''\ Usage: %prog [options] diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 7fe8a278e8..ad89a08cb6 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -9,15 +9,16 @@ from PyQt4.QtGui import QListView, QIcon, QFont, QLabel, QListWidget, \ QSyntaxHighlighter, QCursor, QColor, QWidget, \ QAbstractItemDelegate, QPixmap, QStyle, QFontMetrics from PyQt4.QtCore import QAbstractListModel, QVariant, Qt, SIGNAL, \ - QObject, QRegExp, QString + QObject, QRegExp, QString, QSettings from calibre.gui2.jobs2 import DetailView -from calibre.gui2 import human_readable, NONE, TableView, qstring_to_unicode, error_dialog +from calibre.gui2 import human_readable, NONE, TableView, \ + qstring_to_unicode, error_dialog from calibre.gui2.filename_pattern_ui import Ui_Form -from calibre import fit_image, Settings +from calibre import fit_image from calibre.utils.fontconfig import find_font_families -from calibre.ebooks.metadata.meta import get_filename_pat, metadata_from_filename, \ - set_filename_pat +from calibre.ebooks.metadata.meta import metadata_from_filename +from calibre.utils.config import prefs @@ -29,7 +30,7 @@ class FilenamePattern(QWidget, Ui_Form): self.connect(self.test_button, SIGNAL('clicked()'), self.do_test) self.connect(self.re, SIGNAL('returnPressed()'), self.do_test) - self.re.setText(get_filename_pat()) + self.re.setText(prefs['filename_pattern']) def do_test(self): try: @@ -66,9 +67,9 @@ class FilenamePattern(QWidget, Ui_Form): return re.compile(pat) def commit(self): - pat = self.pattern() - set_filename_pat(pat) - return pat.pattern + pat = self.pattern().pattern + prefs['filename_pattern'] = pat + return pat @@ -367,13 +368,13 @@ class PythonHighlighter(QSyntaxHighlighter): @classmethod def loadConfig(cls): Config = cls.Config + settings = QSettings() def setDefaultString(name, default): value = settings.value(name).toString() if value.isEmpty(): value = default Config[name] = value - settings = Settings() for name in ("window", "shell"): Config["%swidth" % name] = settings.value("%swidth" % name, QVariant(QApplication.desktop() \ diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index fe1fe6580b..cd5f40a778 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -10,7 +10,8 @@ Command line interface to the calibre database. import sys, os from textwrap import TextWrapper -from calibre import OptionParser, Settings, terminal_controller, preferred_encoding +from calibre import terminal_controller, preferred_encoding +from calibre.utils.config import OptionParser, prefs try: from calibre.utils.single_qt_application import send_message except: @@ -24,7 +25,8 @@ FIELDS = set(['title', 'authors', 'publisher', 'rating', 'timestamp', 'size', 't def get_parser(usage): parser = OptionParser(usage) go = parser.add_option_group('GLOBAL OPTIONS') - go.add_option('--database', default=None, help=_('Path to the calibre database. Default is to use the path stored in the settings.')) + go.add_option('--database', default=None, + help=_('Path to the calibre database. Default is to use the path stored in the settings.')) return parser def get_db(dbpath, options): @@ -422,7 +424,7 @@ For help on an individual command: %%prog command --help return 1 command = eval('command_'+args[1]) - dbpath = Settings().get('database path') + dbpath = prefs.get('database_path') return command(args[2:], dbpath) diff --git a/src/calibre/linux_installer.py b/src/calibre/linux_installer.py index d2e19e913a..f494bd0b14 100644 --- a/src/calibre/linux_installer.py +++ b/src/calibre/linux_installer.py @@ -244,6 +244,7 @@ def do_postinstall(destdir): os.chdir(destdir) os.environ['LD_LIBRARY_PATH'] = destdir+':'+os.environ.get('LD_LIBRARY_PATH', '') os.environ['PYTHONPATH'] = destdir + os.environ['PYTHONSTARTUP'] = '' subprocess.call((os.path.join(destdir, 'calibre_postinstall'), '--save-manifest-to', t.name)) finally: os.chdir(cwd) diff --git a/src/calibre/startup.py b/src/calibre/startup.py new file mode 100644 index 0000000000..347a1fab93 --- /dev/null +++ b/src/calibre/startup.py @@ -0,0 +1,149 @@ +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Perform various initialization tasks. +''' + +import locale, sys, os, re, cStringIO +from gettext import GNUTranslations + +# Default translation is NOOP +import __builtin__ +__builtin__.__dict__['_'] = lambda s: s + +from calibre.constants import iswindows, isosx, islinux, isfrozen +from calibre.translations.msgfmt import make + +_run_once = False +if not _run_once: + _run_once = True + ################################################################################ + # Setup translations + + def get_lang(): + lang = locale.getdefaultlocale()[0] + if lang is None and os.environ.has_key('LANG'): # Needed for OS X + try: + lang = os.environ['LANG'] + except: + pass + if lang: + match = re.match('[a-z]{2,3}', lang) + if match: + lang = match.group() + return lang + + def set_translator(): + # To test different translations invoke as + # LC_ALL=de_DE.utf8 program + try: + from calibre.translations.compiled import translations + except: + return + lang = get_lang() + if lang: + buf = None + if os.access(lang+'.po', os.R_OK): + buf = cStringIO.StringIO() + make(lang+'.po', buf) + buf = cStringIO.StringIO(buf.getvalue()) + elif translations.has_key(lang): + buf = cStringIO.StringIO(translations[lang]) + if buf is not None: + t = GNUTranslations(buf) + t.install(unicode=True) + + set_translator() + + ################################################################################ + # Initialize locale + try: + locale.setlocale(locale.LC_ALL, '') + except: + dl = locale.getdefaultlocale() + try: + if dl: + locale.setlocale(dl[0]) + except: + pass + + ################################################################################ + # Load plugins + if isfrozen: + if iswindows: + plugin_path = os.path.join(os.path.dirname(sys.executable), 'plugins') + sys.path.insert(1, os.path.dirname(sys.executable)) + elif isosx: + plugin_path = os.path.join(getattr(sys, 'frameworks_dir'), 'plugins') + elif islinux: + plugin_path = os.path.join(getattr(sys, 'frozen_path'), 'plugins') + sys.path.insert(0, plugin_path) + else: + import pkg_resources + plugins = getattr(pkg_resources, 'resource_filename')('calibre', 'plugins') + sys.path.insert(0, plugins) + + plugins = {} + for plugin in ['pictureflow', 'lzx', 'msdes'] + \ + (['winutil'] if iswindows else []) + \ + (['usbobserver'] if isosx else []): + try: + p, err = __import__(plugin), '' + except Exception, err: + p = None + err = str(err) + plugins[plugin] = (p, err) + + ################################################################################ + # Improve builtin path functions to handle unicode sensibly + + _abspath = os.path.abspath + def my_abspath(path, encoding=sys.getfilesystemencoding()): + ''' + Work around for buggy os.path.abspath. This function accepts either byte strings, + in which it calls os.path.abspath, or unicode string, in which case it first converts + to byte strings using `encoding`, calls abspath and then decodes back to unicode. + ''' + to_unicode = False + if isinstance(path, unicode): + path = path.encode(encoding) + to_unicode = True + res = _abspath(path) + if to_unicode: + res = res.decode(encoding) + return res + + os.path.abspath = my_abspath + _join = os.path.join + def my_join(a, *p): + encoding=sys.getfilesystemencoding() + p = [a] + list(p) + _unicode = False + for i in p: + if isinstance(i, unicode): + _unicode = True + break + p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p] + + res = _join(*p) + if _unicode: + res = res.decode(encoding) + return res + + os.path.join = my_join + + + ################################################################################ + # Platform specific modules + winutil = winutilerror = None + if iswindows: + winutil, winutilerror = plugins['winutil'] + if not winutil: + raise RuntimeError('Failed to load the winutil plugin: %s'%winutilerror) + if len(sys.argv) > 1: + sys.argv[1:] = winutil.argv()[1-len(sys.argv):] + + ################################################################################ + \ No newline at end of file diff --git a/src/calibre/translations/pygettext.py b/src/calibre/translations/pygettext.py index 0c6fac8d9f..9578ef2d51 100644 --- a/src/calibre/translations/pygettext.py +++ b/src/calibre/translations/pygettext.py @@ -164,8 +164,8 @@ DEFAULTKEYWORDS = ', '.join(default_keywords) EMPTYSTRING = '' -from calibre import __appname__ -from calibre import __version__ as version +from calibre.constants import __appname__ +from calibre.constants import __version__ as version # The normal pot-file header. msgmerge and Emacs's po-mode work better if it's # there. @@ -641,4 +641,4 @@ def main(outfile, args=sys.argv[1:]): eater.write(outfile) if __name__ == '__main__': - main(sys.stdout) \ No newline at end of file + main(sys.stdout) diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index 8191ac402a..997bfa230f 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -6,10 +6,14 @@ __docformat__ = 'restructuredtext en' ''' Manage application-wide preferences. ''' -import os, re, cPickle +import os, re, cPickle, textwrap from copy import deepcopy +from optparse import OptionParser as _OptionParser +from optparse import IndentedHelpFormatter from PyQt4.QtCore import QString -from calibre import iswindows, isosx, OptionParser, ExclusiveFile, LockError +from calibre.constants import terminal_controller, iswindows, isosx, \ + __appname__, __version__, __author__ +from calibre.utils.lock import LockError, ExclusiveFile from collections import defaultdict if iswindows: @@ -26,7 +30,125 @@ else: if not os.path.exists(config_dir): os.makedirs(config_dir, mode=448) # 0700 == 448 + +class CustomHelpFormatter(IndentedHelpFormatter): + def format_usage(self, usage): + return _("%sUsage%s: %s\n") % (terminal_controller.BLUE, terminal_controller.NORMAL, usage) + + def format_heading(self, heading): + return "%*s%s%s%s:\n" % (self.current_indent, terminal_controller.BLUE, + "", heading, terminal_controller.NORMAL) + + def format_option(self, option): + result = [] + opts = self.option_strings[option] + opt_width = self.help_position - self.current_indent - 2 + if len(opts) > opt_width: + opts = "%*s%s\n" % (self.current_indent, "", + terminal_controller.GREEN+opts+terminal_controller.NORMAL) + indent_first = self.help_position + else: # start help on same line as opts + opts = "%*s%-*s " % (self.current_indent, "", opt_width + len(terminal_controller.GREEN + terminal_controller.NORMAL), + terminal_controller.GREEN + opts + terminal_controller.NORMAL) + indent_first = 0 + result.append(opts) + if option.help: + help_text = self.expand_default(option).split('\n') + help_lines = [] + + for line in help_text: + help_lines.extend(textwrap.wrap(line, self.help_width)) + result.append("%*s%s\n" % (indent_first, "", help_lines[0])) + result.extend(["%*s%s\n" % (self.help_position, "", line) + for line in help_lines[1:]]) + elif opts[-1] != "\n": + result.append("\n") + return "".join(result)+'\n' + + +class OptionParser(_OptionParser): + + def __init__(self, + usage='%prog [options] filename', + version='%%prog (%s %s)'%(__appname__, __version__), + epilog=_('Created by ')+terminal_controller.RED+__author__+terminal_controller.NORMAL, + gui_mode=False, + conflict_handler='resolve', + **kwds): + usage += '''\n\nWhenever you pass arguments to %prog that have spaces in them, '''\ + '''enclose the arguments in quotation marks.''' + _OptionParser.__init__(self, usage=usage, version=version, epilog=epilog, + formatter=CustomHelpFormatter(), + conflict_handler=conflict_handler, **kwds) + self.gui_mode = gui_mode + + def error(self, msg): + if self.gui_mode: + raise Exception(msg) + _OptionParser.error(self, msg) + + def merge(self, parser): + ''' + Add options from parser to self. In case of conflicts, confilicting options from + parser are skipped. + ''' + opts = list(parser.option_list) + groups = list(parser.option_groups) + + def merge_options(options, container): + for opt in deepcopy(options): + if not self.has_option(opt.get_opt_string()): + container.add_option(opt) + + merge_options(opts, self) + + for group in groups: + g = self.add_option_group(group.title) + merge_options(group.option_list, g) + + def subsume(self, group_name, msg=''): + ''' + Move all existing options into a subgroup named + C{group_name} with description C{msg}. + ''' + opts = [opt for opt in self.options_iter() if opt.get_opt_string() not in ('--version', '--help')] + self.option_groups = [] + subgroup = self.add_option_group(group_name, msg) + for opt in opts: + self.remove_option(opt.get_opt_string()) + subgroup.add_option(opt) + + def options_iter(self): + for opt in self.option_list: + if str(opt).strip(): + yield opt + for gr in self.option_groups: + for opt in gr.option_list: + if str(opt).strip(): + yield opt + + def option_by_dest(self, dest): + for opt in self.options_iter(): + if opt.dest == dest: + return opt + + def merge_options(self, lower, upper): + ''' + Merge options in lower and upper option lists into upper. + Default values in upper are overridden by + non default values in lower. + ''' + for dest in lower.__dict__.keys(): + if not upper.__dict__.has_key(dest): + continue + opt = self.option_by_dest(dest) + if lower.__dict__[dest] != opt.default and \ + upper.__dict__[dest] == opt.default: + upper.__dict__[dest] = lower.__dict__[dest] + + + class Option(object): def __init__(self, name, switches=[], help='', type=None, choices=None, @@ -250,8 +372,154 @@ class StringConfig(object): setattr(opts, name, val) footer = self.option_set.get_override_section(self.src) self.src = self.option_set.serialize(opts)+ '\n\n' + footer + '\n' + +class ConfigProxy(object): + ''' + A Proxy to minimize file reads for widely used config settings + ''' + def __init__(self, config): + self.__config = config + self.__opts = None + + def refresh(self): + self.__opts = self.__config.parse() + def __getitem__(self, key): + return self.get(key) + + def __setitem__(self, key, val): + return self.set(key, val) + + def get(self, key): + if self.__opts is None: + self.refresh() + return getattr(self.__opts, key) + + def set(self, key, val): + if self.__opts is None: + self.refresh() + setattr(self.__opts, key, val) + return self.__config.set(key, val) + +class DynamicConfig(dict): + ''' + A replacement for QSettings that supports dynamic config keys. + Returns `None` if a config key is not found. Note that the config + data is stored in a non human readable pickle file, so only use this + class for preferences that you don't intend to have the users edit directly. + ''' + def __init__(self, name='dynamic'): + self.name = name + self.file_path = os.path.join(config_dir, name+'.pickle') + with ExclusiveFile(self.file_path) as f: + raw = f.read() + d = cPickle.loads(raw) if raw.strip() else {} + dict.__init__(self, d) + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return None + + def __setitem__(self, key, val): + dict.__setitem__(self, key, val) + self.commit() + + def set(self, key, val): + self.__setitem__(key, val) + + def commit(self): + if hasattr(self, 'file_path') and self.file_path: + with ExclusiveFile(self.file_path) as f: + raw = cPickle.dumps(self, -1) + f.seek(0) + f.truncate() + f.write(raw) + +dynamic = DynamicConfig() + +def _prefs(): + c = Config('global', 'calibre wide preferences') + c.add_opt('database_path', + default=os.path.expanduser('~/library1.db'), + help=_('Path to the database in which books are stored')) + c.add_opt('filename_pattern', default=ur'(?P<title>.+) - (?P<author>[^_]+)', + help=_('Pattern to guess metadata from filenames')) + c.add_opt('isbndb_com_key', default='', + help=_('Access key for isbndb.com')) + c.add_opt('network_timeout', default=5, + help=_('Default timeout for network operations (seconds)')) + + c.add_opt('migrated', default=False, help='For Internal use. Don\'t modify.') + return c + +prefs = ConfigProxy(_prefs()) + +def migrate(): + p = prefs + if p.get('migrated'): + return + + from PyQt4.QtCore import QSettings, QVariant + class Settings(QSettings): + + def __init__(self, name='calibre2'): + QSettings.__init__(self, QSettings.IniFormat, QSettings.UserScope, + 'kovidgoyal.net', name) + + def get(self, key, default=None): + try: + key = str(key) + if not self.contains(key): + return default + val = str(self.value(key, QVariant()).toByteArray()) + if not val: + return None + return cPickle.loads(val) + except: + return default + + s, migrated = Settings(), set([]) + all_keys = set(map(unicode, s.allKeys())) + from calibre.gui2 import config, dynamic + def _migrate(key, safe=None, from_qvariant=None, p=config): + try: + if key not in all_keys: + return + if safe is None: + safe = re.sub(r'[^0-9a-zA-Z]', '_', key) + val = s.get(key) + if from_qvariant is not None: + val = getattr(s.value(key), from_qvariant)() + p.set(safe, val) + except: + pass + finally: + migrated.add(key) + + + _migrate('database path', p=prefs) + _migrate('filename pattern', p=prefs) + _migrate('network timeout', p=prefs) + _migrate('isbndb.com key', p=prefs) + + _migrate('frequently used directories') + _migrate('send to device by default') + _migrate('save to disk single format') + _migrate('confirm delete') + _migrate('show text in toolbar') + _migrate('new version notification') + _migrate('use roman numerals for series number') + _migrate('cover flow queue length') + _migrate('LRF conversion defaults') + _migrate('LRF ebook viewer options') + + for key in all_keys - migrated: + if key.endswith(': un') or key.endswith(': pw'): + _migrate(key, p=dynamic) + p.set('migrated', True) if __name__ == '__main__': diff --git a/src/calibre/utils/lock.py b/src/calibre/utils/lock.py new file mode 100644 index 0000000000..692ccb856a --- /dev/null +++ b/src/calibre/utils/lock.py @@ -0,0 +1,86 @@ +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Secure access to locked files from multiple processes. +''' + +from calibre.constants import iswindows, __appname__, \ + win32api, win32event, winerror, fcntl +import time, atexit, os + +class LockError(Exception): + pass + +class ExclusiveFile(object): + + def __init__(self, path, timeout=10): + self.path = path + self.timeout = timeout + + def __enter__(self): + self.file = open(self.path, 'a+b') + self.file.seek(0) + timeout = self.timeout + if iswindows: + name = ('Local\\'+(__appname__+self.file.name).replace('\\', '_'))[:201] + while self.timeout < 0 or timeout >= 0: + self.mutex = win32event.CreateMutex(None, False, name) + if win32api.GetLastError() != winerror.ERROR_ALREADY_EXISTS: break + time.sleep(1) + timeout -= 1 + else: + while self.timeout < 0 or timeout >= 0: + try: + fcntl.lockf(self.file.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) + break + except IOError: + time.sleep(1) + timeout -= 1 + if timeout < 0 and self.timeout >= 0: + self.file.close() + raise LockError + return self.file + + def __exit__(self, type, value, traceback): + self.file.close() + if iswindows: + win32api.CloseHandle(self.mutex) + + +def _clean_lock_file(file): + try: + file.close() + except: + pass + try: + os.remove(file.name) + except: + pass + + +def singleinstance(name): + ''' + Return True if no other instance of the application identified by name is running, + False otherwise. + @param name: The name to lock. + @type name: string + ''' + if iswindows: + mutexname = 'mutexforsingleinstanceof'+__appname__+name + mutex = win32event.CreateMutex(None, False, mutexname) + if mutex: + atexit.register(win32api.CloseHandle, mutex) + return not win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS + else: + path = os.path.expanduser('~/.'+__appname__+'_'+name+'.lock') + try: + f = open(path, 'w') + fcntl.lockf(f.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) + atexit.register(_clean_lock_file, f) + return True + except IOError: + return False + + return False diff --git a/src/calibre/web/fetch/simple.py b/src/calibre/web/fetch/simple.py index 82b09a321a..749c57bcde 100644 --- a/src/calibre/web/fetch/simple.py +++ b/src/calibre/web/fetch/simple.py @@ -12,9 +12,10 @@ from urllib import url2pathname from httplib import responses from calibre import setup_cli_handlers, browser, sanitize_file_name, \ - OptionParser, relpath, LoggingInterface + relpath, LoggingInterface from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag from calibre.ebooks.chardet import xml_to_unicode +from calibre.utils.config import OptionParser class FetchError(Exception): pass From 6ec84fda14809a26023788e259f0b904132b9ece Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 16 Aug 2008 09:47:21 -0700 Subject: [PATCH 31/31] IGN:... --- src/calibre/ebooks/lrf/comic/convert_from.py | 4 ++-- src/calibre/gui2/dialogs/config.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/lrf/comic/convert_from.py b/src/calibre/ebooks/lrf/comic/convert_from.py index eef7d4cb43..48d19657d0 100755 --- a/src/calibre/ebooks/lrf/comic/convert_from.py +++ b/src/calibre/ebooks/lrf/comic/convert_from.py @@ -180,7 +180,7 @@ class PageProcessor(list): MagickSetImageType(wand, GrayscaleType) MagickQuantizeImage(wand, self.opts.colors, RGBColorspace, 0, 1, 0) - dest = '%d_%d%s'%(self.num, i, os.path.splitext(self.path_to_page)[-1]) + dest = '%d_%d.png'%(self.num, i) dest = os.path.join(self.dest, dest) MagickWriteImage(wand, dest) self.append(dest) @@ -335,4 +335,4 @@ def main(args=sys.argv, notification=None): return 0 if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py index c84c3a3713..dd34aba10d 100644 --- a/src/calibre/gui2/dialogs/config.py +++ b/src/calibre/gui2/dialogs/config.py @@ -13,7 +13,6 @@ from calibre.gui2.widgets import FilenamePattern from calibre.ebooks import BOOK_EXTENSIONS - class ConfigDialog(QDialog, Ui_Dialog): def __init__(self, window, db, columns): @@ -98,7 +97,7 @@ class ConfigDialog(QDialog, Ui_Dialog): config['show_text_in_toolbar'] = bool(self.show_toolbar_text.isChecked()) config['confirm_delete'] = bool(self.confirm_delete.isChecked()) pattern = self.filename_pattern.commit() - config['filename_pattern'] = pattern + prefs['filename_pattern'] = pattern config['save_to_disk_single_format'] = BOOK_EXTENSIONS[self.single_format.currentIndex()] config['cover_flow_queue_length'] = self.cover_browse.value()