From a5e4ed27794cdc02600ff2c205f56a7d11a37e40 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 08:41:50 -0800 Subject: [PATCH 01/37] Fix #1577 (Language config on MacOSX) --- src/calibre/trac/plugins/download.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index 6436aba448..3b0965eefc 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -205,23 +205,7 @@ select Install.
  1. Before trying to use the command line tools, you must run the app at least once. This will ask you for you password and then setup the symbolic links for the command line tools.
  2. The app cannot be run from within the dmg. You must drag it to a folder on your filesystem (The Desktop, Applications, wherever).
  3. -
  4. In order for the conversion of RTF to LRF to support WMF images (common in older RTF files) you need to install ImageMagick.
  5. -
  6. In order for localization of the user interface in your language you must create the file ~/.MacOSX/environment.plist as shown below: -
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    -<plist version="1.0">
    -<dict>
    -        <key>LANG</key>
    -        <string>de_DE</string>
    -</dict>
    -</plist>
    -
    -The example above is for the German language. Substitute the language code you need. -After creating the file you need to log out and log in again for the changes to become -active. Of course, this will only work if calibre has been translated for your language. -If not, head over to Translations to see how you can translate it. -
  7. +
  8. In order for localization of the user interface in your language, select your language in the configuration dialog (by clicking the hammer icon next to the search bar) and select your language.
''')) return 'binary.html', data, None From 064275ef26e3e57ed27ae90d258b9172838b462f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 09:10:44 -0800 Subject: [PATCH 02/37] IGN:Add the Times Literary Supplement to the Times Online recipe --- src/calibre/trac/donations/server.py | 3 +-- src/calibre/web/feeds/recipes/recipe_times_online.py | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/trac/donations/server.py b/src/calibre/trac/donations/server.py index cbb68d972e..c3e0337290 100644 --- a/src/calibre/trac/donations/server.py +++ b/src/calibre/trac/donations/server.py @@ -217,8 +217,7 @@ class Server(object): pos = pos.replace(month = 1) else: pos = pos.replace(month = pos.month + 1) - - _months = list(months(self.earliest, self.latest))[:-1][:12] + _months = list(months(self.earliest, self.latest))[:-1][-12:] _months = [range_for_month(*m) for m in _months] _months = [self.get_slice(*m) for m in _months] x = [m.min for m in _months] diff --git a/src/calibre/web/feeds/recipes/recipe_times_online.py b/src/calibre/web/feeds/recipes/recipe_times_online.py index e52df9201a..e57b331820 100644 --- a/src/calibre/web/feeds/recipes/recipe_times_online.py +++ b/src/calibre/web/feeds/recipes/recipe_times_online.py @@ -33,6 +33,7 @@ class TimesOnline(BasicNewsRecipe): ('Sports News', 'http://www.timesonline.co.uk/tol/feeds/rss/sport.xml'), ('Film News', 'http://www.timesonline.co.uk/tol/feeds/rss/film.xml'), ('Tech news', 'http://www.timesonline.co.uk/tol/feeds/rss/tech.xml'), + ('Literary Supplement', 'http://www.timesonline.co.uk/tol/feeds/rss/thetls.xml'), ] def print_version(self, url): From 5e057aa907dbea92d51c2789562a5b9b49645c4e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 09:50:32 -0800 Subject: [PATCH 03/37] Added recipe for Heise Telepolis (thanks to Darko Miletic) --- src/calibre/gui2/images/news/telepolis.png | Bin 0 -> 586 bytes src/calibre/web/feeds/recipes/__init__.py | 2 +- .../web/feeds/recipes/recipe_telepolis.py | 34 ++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/calibre/gui2/images/news/telepolis.png create mode 100644 src/calibre/web/feeds/recipes/recipe_telepolis.py diff --git a/src/calibre/gui2/images/news/telepolis.png b/src/calibre/gui2/images/news/telepolis.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1c14b96cb21701f5e1eff679404ab85edc0cc5 GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%b@U_I1CZGssfk$L9 zkoEv$x0Bg+Ai=T%$8;bK*3S@gZ0%tN2F7Af7sn8b)4h`ymfdy`aLq4by0;;AT5DSq z@8*PrL>}JIv{~m166=;5%oo@!;pKBWErMHR_1TU6ciXo_y|vw3?pFR@e*S*O35A9a zpI1LT{rK<~r3VEJ2UK;K*w=`7aN5^6u&6m|PWZ%B>Ch(M&$GKP#m&v);DzrQ+m&nY z3*6;TG1#>@=)qUf==F*Z<}pNzUb-#)@lzAWtIx*!?hEH~m#RFzU~=WH*lN*l)io;^ z?ld>MUI0mjhfl(SXmaFomRNFZJ+wDe=IY~WmRU^FgT@1dUP9ju2|E- zk@WA~Jnc^X)siJPegT{vuN#8T^vH;Qv)}kVe)8-ojAwKAh;p9&ZnsT0$IK?}uQ9v% zqsJ$Hd~qqUo?>L=Yy5G4LvYZkCzJmD+M)U}rfmYt4bg^mf=TZ-&1X(&DtHwzUCuwf zNrEj&Mqf#s{UPJot`}AjrgN5^_F7nGt+cfJ=w03YpF@tN?ENP3c>~9R4_4=-_9gve zFkU{DdF{=O*}%9^Epd$~NiIrFEJ@W(0TK*G1_qY828Ox@mLUd~Rwl+)Ag+a#fkDk# gy$di6x%nxXX_W*tDAz Date: Fri, 9 Jan 2009 10:37:41 -0800 Subject: [PATCH 04/37] Fix EPUB version of Christian Science Monitor. Fixes #1578 (News - dl News not saving .epub properly) --- src/calibre/web/feeds/recipes/recipe_chr_mon.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/calibre/web/feeds/recipes/recipe_chr_mon.py b/src/calibre/web/feeds/recipes/recipe_chr_mon.py index dceeb5aab8..b9f94fcd1c 100644 --- a/src/calibre/web/feeds/recipes/recipe_chr_mon.py +++ b/src/calibre/web/feeds/recipes/recipe_chr_mon.py @@ -42,3 +42,9 @@ class ChristianScienceMonitor(BasicNewsRecipe): feeds[-1][1].append(art) return feeds + def postprocess_html(self, soup, first_fetch): + html = soup.find('html') + if html is None: + return soup + html.extract() + return html From 4ee280755189b1ab024deafd54ee94a74ab96633 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 11:51:40 -0800 Subject: [PATCH 05/37] Fix #1579 (Problem retrieveing image file as cover) --- src/calibre/web/feeds/news.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 15b42d442d..85ed39a16d 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -765,6 +765,8 @@ class BasicNewsRecipe(object, LoggingInterface): self.log_debug(traceback.format_exc()) if cu is not None: ext = cu.rpartition('.')[-1] + if '?' in ext: + ext = '' ext = ext.lower() if ext else 'jpg' self.report_progress(1, _('Downloading cover from %s')%cu) cpath = os.path.join(self.output_dir, 'cover.'+ext) From db322903261e0e3d28a8a30d48d7e125c92a65a7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 12:36:03 -0800 Subject: [PATCH 06/37] Error checking and getting meta-data right --- src/calibre/ebooks/pdf/pdftrim.py | 20 +++++++++++++++----- src/pyPdf/pdf.py | 6 ++++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/calibre/ebooks/pdf/pdftrim.py b/src/calibre/ebooks/pdf/pdftrim.py index b194d93b9d..2054f22558 100644 --- a/src/calibre/ebooks/pdf/pdftrim.py +++ b/src/calibre/ebooks/pdf/pdftrim.py @@ -29,7 +29,7 @@ def config(defaults=None): c.add_opt('top_right_y', [ '-w', '--righty'], default=default_crop, help=_('Number of pixels to crop from the right most y (default is %d)')%default_crop ) c.add_opt('bounding', ['-b', '--bounding'], - help=_('A file generated by ghostscript which allows each page to be individually cropped')) + help=_('A file generated by ghostscript which allows each page to be individually cropped [gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox > bounding] ')) return c @@ -38,14 +38,24 @@ def option_parser(): return c.option_parser(usage=_('''\ %prog [options] file.pdf - Crop a pdf. + Crops a pdf. ''')) def main(args=sys.argv): parser = option_parser() opts, args = parser.parse_args(args) - source = os.path.abspath(args[1]) - input_pdf = PdfFileReader(file(source, "rb")) + try: + source = os.path.abspath(args[1]) + input_pdf = PdfFileReader(file(source, "rb")) + except: + print "Unable to read input" + return 2 + info = input_pdf.getDocumentInfo() + title = 'Unknown' + author = 'Unknown' + if info.title: + title = info.title + author = info.author if opts.bounding != None: try: bounding = open( opts.bounding , 'r' ) @@ -53,7 +63,7 @@ def main(args=sys.argv): except: print 'Error opening %s' % opts.bounding return 1 - output_pdf = PdfFileWriter() + output_pdf = PdfFileWriter(title=title,author=author) for page_number in range (0, input_pdf.getNumPages() ): page = input_pdf.getPage(page_number) if opts.bounding != None: diff --git a/src/pyPdf/pdf.py b/src/pyPdf/pdf.py index 3cf7a60f0e..362879a39a 100644 --- a/src/pyPdf/pdf.py +++ b/src/pyPdf/pdf.py @@ -55,7 +55,7 @@ from utils import readNonWhitespace, readUntilWhitespace, ConvertFunctionsToVirt # This class supports writing PDF files out, given pages produced by another # class (typically {@link #PdfFileReader PdfFileReader}). class PdfFileWriter(object): - def __init__(self): + def __init__(self,title=u"Unknown",author=u"Unknown"): self._header = "%PDF-1.3" self._objects = [] # array of indirect objects @@ -71,7 +71,9 @@ class PdfFileWriter(object): # info object info = DictionaryObject() info.update({ - NameObject("/Producer"): createStringObject(u"Python PDF Library - http://pybrary.net/pyPdf/") + NameObject("/Producer"): createStringObject(u"Python PDF Library - http://pybrary.net/pyPdf/"), + NameObject("/Author"): createStringObject(author), + NameObject("/Title"): createStringObject(title), }) self._info = self._addObject(info) From 049e7b202b27f9936ee417f3317b877c4d3bcb16 Mon Sep 17 00:00:00 2001 From: John Schember Date: Fri, 9 Jan 2009 17:59:15 -0500 Subject: [PATCH 07/37] Updated Kindle driver --- src/calibre/devices/kindle/driver.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index 06c3b1cf27..f6c32915f2 100755 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -20,7 +20,7 @@ class KINDLE(USBMS): VENDOR_ID = 0x1949 PRODUCT_ID = 0x0001 - BCD = 0x399 + BCD = [0x399] VENDOR_NAME = 'AMAZON' PRODUCT_NAME = 'KINDLE' @@ -30,3 +30,15 @@ class KINDLE(USBMS): EBOOK_DIR = "documents" + def delete_books(self, paths, end_session=True): + for path in paths: + if os.path.exists(path): + os.unlink(path) + + filepath, ext = os.path.splitext(path) + basepath, filename = os.path.split(filepath) + + # Delete the ebook auxiliary file + if os.path.exists(filepath + '.mbp'): + os.unlink(filepath + '.mbp') + From f02c3619185f1b38e215c4f49dfa188eace05a5a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 17:13:09 -0800 Subject: [PATCH 08/37] Fix regression in news download scheduling system. If you set news to be downloaded using calibre versions before 0.4.125, all the scheduling/account information for the downloads may be lost. You have to reset the recipes for download. Sorry for the inconvenience. Fixes #1580 (News Download Duplicates & Unscheduled downloads) --- src/calibre/gui2/dialogs/scheduler.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index f61c220bb9..a4bfe9f665 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -75,7 +75,13 @@ def save_recipes(recipes): def load_recipes(): config.refresh() - return [Recipe().unpickle(r) for r in config.get('scheduled_recipes', [])] + recipes = [] + for r in config.get('scheduled_recipes', []): + r = Recipe().unpickle(r) + if r.builtin and not str(r.id).startswith('recipe_'): + continue + recipes.append(r) + return recipes class RecipeModel(QAbstractListModel, SearchQueryParser): @@ -438,7 +444,7 @@ class Scheduler(QObject): self.lock.unlock() def main(args=sys.argv): - app = QApplication([]) + QApplication([]) from calibre.library.database2 import LibraryDatabase2 d = SchedulerDialog(LibraryDatabase2('/home/kovid/documents/library')) d.exec_() From d269e83191eaddc27a4970d9718ace9e93f8ff79 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 17:14:13 -0800 Subject: [PATCH 09/37] Fix #1585 (Fedora Download page has wrong package name) --- src/calibre/trac/plugins/download.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index 3b0965eefc..0fee4fdb0d 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -35,7 +35,7 @@ class Distribution(object): ('xdg-utils', '1.0.2', 'xdg-utils', 'xdg-utils', 'xdg-utils'), ('dbus-python', '0.82.2', 'dbus-python', 'python-dbus', 'dbus-python'), ('lxml', '2.0.5', 'lxml', 'python-lxml', 'python-lxml'), - ('BeautifulSoup', '3.0.5', 'beautifulsoup', 'python-beautifulsoup', 'python-beautifulsoup'), + ('BeautifulSoup', '3.0.5', 'beautifulsoup', 'python-beautifulsoup', 'python-BeautifulSoup'), ('help2man', '1.36.4', 'help2man', 'help2man', 'help2man'), ] From f46fedab9b2aba0920e43aebc304bebf61d7cd4f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 17:25:55 -0800 Subject: [PATCH 10/37] EPUB output: Don't split on page breaks when converting from PDF files, since PDF files have page breaks after every page. This makes reading EPUBs generated from PDFs more pleasant. --- src/calibre/ebooks/epub/from_any.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/ebooks/epub/from_any.py b/src/calibre/ebooks/epub/from_any.py index e204b38b03..51fdcc4e6a 100644 --- a/src/calibre/ebooks/epub/from_any.py +++ b/src/calibre/ebooks/epub/from_any.py @@ -67,6 +67,7 @@ def txt2opf(path, tdir, opts): def pdf2opf(path, tdir, opts): from calibre.ebooks.lrf.pdf.convert_from import generate_html generate_html(path, tdir) + opts.dont_split_on_page_breaks = True return os.path.join(tdir, 'metadata.opf') def epub2opf(path, tdir, opts): From e26b23255f849ea650129b8bca01266e8a52de4d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 18:19:04 -0800 Subject: [PATCH 11/37] version 0.4.127 --- src/calibre/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 2209f482f5..12b17b7f0a 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.4.126' +__version__ = '0.4.127' __author__ = "Kovid Goyal " ''' Various run time constants. From 7a5306e24378ef89bc5dfd1883d9069f0353ed36 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 9 Jan 2009 18:27:39 -0800 Subject: [PATCH 12/37] IGN:Tag release From fb2832c3edb7727a8f6e52f5918a5297d801a0bb Mon Sep 17 00:00:00 2001 From: "Marshall T. Vandegrift" Date: Sat, 10 Jan 2009 00:34:02 -0500 Subject: [PATCH 13/37] Fix glitch in HTML 3.2 font/@face -> CSS font-family conversion. --- src/calibre/ebooks/html.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/html.py b/src/calibre/ebooks/html.py index 84af7527bd..c938847051 100644 --- a/src/calibre/ebooks/html.py +++ b/src/calibre/ebooks/html.py @@ -796,7 +796,18 @@ class Processor(Parser): setting = '' face = font.attrib.pop('face', None) if face is not None: - setting += 'font-face:%s;'%face + faces = [] + for face in face.split(','): + if ' ' in face: + face = "%s" % face + faces.append(face) + for generic in ('serif', 'sans-serif', 'monospace'): + if generic in faces: + break + else: + faces.append('serif') + family = ', '.join(faces) + setting += 'font-family: %s;' % family color = font.attrib.pop('color', None) if color is not None: setting += 'color:%s'%color From afab0395d3de1099aa42db9c06884378079e267c Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 10 Jan 2009 08:06:44 -0500 Subject: [PATCH 14/37] skip osx detection if identifier is not set --- src/calibre/devices/usbms/device.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index f6b0c6a0a8..18645ca9b2 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -26,8 +26,8 @@ class Device(_Device): VENDOR_NAME = '' PRODUCT_NAME = '' - OSX_NAME_MAIN_MEM = '' - OSX_NAME_CARD_MEM = '' + OSX_NAME_MAIN_MEM = None + OSX_NAME_CARD_MEM = None MAIN_MEMORY_VOLUME_LABEL = '' STORAGE_CARD_VOLUME_LABEL = '' @@ -207,9 +207,9 @@ class Device(_Device): break for i, line in enumerate(lines): - if line.strip().endswith('') and self.OSX_NAME_MAIN_MEM in line: + if self.OSX_NAME_MAIN_MEM is not None and line.strip().endswith('') and self.OSX_NAME_MAIN_MEM in line: get_dev_node(lines[i+1:], 'main') - if line.strip().endswith('') and self.OSX_NAME_CARD_MEM in line: + if self.OSX_NAME_CARD_MEM is not None and line.strip().endswith('') and self.OSX_NAME_CARD_MEM in line: get_dev_node(lines[i+1:], 'card') if len(names.keys()) == 2: break From 3ade4dc4105e8e8d713d5f6cc2df97b092be1f09 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 10 Jan 2009 08:10:19 -0500 Subject: [PATCH 15/37] Can use separate ebook dir on card and main memory --- src/calibre/devices/cybookg3/driver.py | 2 +- src/calibre/devices/kindle/driver.py | 2 +- src/calibre/devices/usbms/driver.py | 12 +++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/calibre/devices/cybookg3/driver.py b/src/calibre/devices/cybookg3/driver.py index cf9f2e5a41..b9a16965c4 100644 --- a/src/calibre/devices/cybookg3/driver.py +++ b/src/calibre/devices/cybookg3/driver.py @@ -33,7 +33,7 @@ class CYBOOKG3(USBMS): MAIN_MEMORY_VOLUME_LABEL = 'Cybook Gen 3 Main Memory' STORAGE_CARD_VOLUME_LABEL = 'Cybook Gen 3 Storage Card' - EBOOK_DIR = "eBooks" + EBOOK_DIR_MAIN = "eBooks" def delete_books(self, paths, end_session=True): for path in paths: diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index f6c32915f2..8457dbc89b 100755 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -28,7 +28,7 @@ class KINDLE(USBMS): MAIN_MEMORY_VOLUME_LABEL = 'Kindle Main Memory' STORAGE_CARD_VOLUME_LABEL = 'Kindle Storage Card' - EBOOK_DIR = "documents" + EBOOK_DIR_MAIN = "documents" def delete_books(self, paths, end_session=True): for path in paths: diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 733ce76ae7..ba89db29c9 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -14,7 +14,8 @@ from calibre.devices.usbms.books import BookList, Book from calibre.devices.errors import FreeSpaceError class USBMS(Device): - EBOOK_DIR = '' + EBOOK_DIR_MAIN = '' + EBOOK_DIR_CARD = '' MIME_MAP = {} FORMATS = [] @@ -35,9 +36,10 @@ class USBMS(Device): return bl prefix = self._card_prefix if oncard else self._main_prefix + ebook_dir = self.EBOOK_DIR_CARD if oncard else self.EBOOK_DIR_MAIN - # Get all books in all directories under the root EBOOK_DIR directory - for path, dirs, files in os.walk(os.path.join(prefix, self.EBOOK_DIR)): + # Get all books in all directories under the root ebook_dir directory + for path, dirs, files in os.walk(os.path.join(prefix, ebook_dir)): # Filter out anything that isn't in the list of supported ebook types for book_type in self.MIME_MAP.keys(): for filename in fnmatch.filter(files, '*.%s' % (book_type)): @@ -51,9 +53,9 @@ class USBMS(Device): raise ValueError(_('The reader has no storage card connected.')) if not on_card: - path = os.path.join(self._main_prefix, self.EBOOK_DIR) + path = os.path.join(self._main_prefix, self.EBOOK_DIR_MAIN) else: - path = os.path.join(self._card_prefix, self.EBOOK_DIR) + path = os.path.join(self._card_prefix, self.EBOOK_DIR_CARD) sizes = map(os.path.getsize, files) size = sum(sizes) From 701e8cfc917fee03db53a9ba907439ca5ad98b07 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 10 Jan 2009 11:13:17 -0500 Subject: [PATCH 16/37] Windows drive detection based on given id. Fixes drive order bug on Cybook. --- src/calibre/devices/cybookg3/driver.py | 7 +-- src/calibre/devices/kindle/driver.py | 2 +- src/calibre/devices/usbms/device.py | 74 ++++++++++++++------------ 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/calibre/devices/cybookg3/driver.py b/src/calibre/devices/cybookg3/driver.py index b9a16965c4..7ab9a909a0 100644 --- a/src/calibre/devices/cybookg3/driver.py +++ b/src/calibre/devices/cybookg3/driver.py @@ -25,10 +25,11 @@ class CYBOOKG3(USBMS): BCD = [0x110, 0x132] VENDOR_NAME = 'BOOKEEN' - PRODUCT_NAME = 'CYBOOK_GEN3' + WINDOWS_MAIN_MEM = 'CYBOOK_GEN3__-FD' + WINDOWS_CARD_MEM = 'CYBOOK_GEN3__-SD' - OSX_NAME_MAIN_MEM = 'Bookeen Cybook Gen3 -FD Media' - OSX_NAME_CARD_MEM = 'Bookeen Cybook Gen3 -SD Media' + OSX_MAIN_MEM = 'Bookeen Cybook Gen3 -FD Media' + OSX_CARD_MEM = 'Bookeen Cybook Gen3 -SD Media' MAIN_MEMORY_VOLUME_LABEL = 'Cybook Gen 3 Main Memory' STORAGE_CARD_VOLUME_LABEL = 'Cybook Gen 3 Storage Card' diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index 8457dbc89b..4313f24847 100755 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -23,7 +23,7 @@ class KINDLE(USBMS): BCD = [0x399] VENDOR_NAME = 'AMAZON' - PRODUCT_NAME = 'KINDLE' + WINDOWS_MAIN_MEM = 'KINDLE' MAIN_MEMORY_VOLUME_LABEL = 'Kindle Main Memory' STORAGE_CARD_VOLUME_LABEL = 'Kindle Storage Card' diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 18645ca9b2..128bc58ec5 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -23,11 +23,12 @@ class Device(_Device): PRODUCT_ID = 0x0 BCD = None - VENDOR_NAME = '' - PRODUCT_NAME = '' + VENDOR_NAME = None + WINDOWS_MAIN_MEM = None + WINDOWS_CARD_MEM = None - OSX_NAME_MAIN_MEM = None - OSX_NAME_CARD_MEM = None + OSX_MAIN_MEM = None + OSX_CARD_MEM = None MAIN_MEMORY_VOLUME_LABEL = '' STORAGE_CARD_VOLUME_LABEL = '' @@ -148,43 +149,46 @@ class Device(_Device): return (msz, 0, csz) - @classmethod - def windows_match_device(cls, device_id): - device_id = device_id.upper() - if 'VEN_'+cls.VENDOR_NAME in device_id and \ - 'PROD_'+cls.PRODUCT_NAME in device_id: - return True - vid, pid = hex(cls.VENDOR_ID)[2:], hex(cls.PRODUCT_ID)[2:] - while len(vid) < 4: vid = '0' + vid - while len(pid) < 4: pid = '0' + pid - if 'VID_'+vid in device_id and 'PID_'+pid in device_id: - return True + def windows_match_device(self, pnp_id, device_id): + if device_id and pnp_id is not None: + pnp_id = pnp_id.upper() + device_id = device_id.upper() + + if 'VEN_' + self.VENDOR_NAME in pnp_id and 'PROD_' + device_id in pnp_id: + return True + return False - # This only supports Windows >= 2000 + def windows_get_drive_prefix(self, drive): + prefix = None + + try: + partition = drive.associators("Win32_DiskDriveToDiskPartition")[0] + logical_disk = partition.associators('Win32_LogicalDiskToPartition')[0] + prefix = logical_disk.DeviceID + os.sep + except IndexError: + pass + + return prefix + def open_windows(self): - drives = [] + drives = {} wmi = __import__('wmi', globals(), locals(), [], -1) c = wmi.WMI() for drive in c.Win32_DiskDrive(): - if self.__class__.windows_match_device(str(drive.PNPDeviceID)): - if drive.Partitions == 0: - continue - try: - partition = drive.associators("Win32_DiskDriveToDiskPartition")[0] - logical_disk = partition.associators('Win32_LogicalDiskToPartition')[0] - prefix = logical_disk.DeviceID+os.sep - drives.append((drive.Index, prefix)) - except IndexError: - continue + if self.windows_match_device(str(drive.PNPDeviceID), WINDOWS_MAIN_MEM): + drives['main'] = self.windows_get_drive_prefix(drive) + else if self.windows_match_device(str(drive.PNPDeviceID), WINDOWS_CARD_MEM): + drives['card'] = self.windows_get_drive_prefix(drive) + + if 'main' and 'card' in drives.keys(): + break if not drives: - raise DeviceError(_('Unable to detect the %s disk drive. Try rebooting.')%self.__class__.__name__) - - drives.sort(cmp=lambda a, b: cmp(a[0], b[0])) - self._main_prefix = drives[0][1] - if len(drives) > 1: - self._card_prefix = drives[1][1] + raise DeviceError(_('Unable to detect the %s disk drive. Try rebooting.') % self.__class__.__name__) + + self._main_prefix = drives['main'] if 'main' in names.keys() else None + self._card_prefix = drives['card'] if 'card' in names.keys() else None @classmethod def get_osx_mountpoints(self, raw=None): @@ -207,9 +211,9 @@ class Device(_Device): break for i, line in enumerate(lines): - if self.OSX_NAME_MAIN_MEM is not None and line.strip().endswith('') and self.OSX_NAME_MAIN_MEM in line: + if self.OSX_MAIN_MEM is not None and line.strip().endswith('') and self.OSX_MAIN_MEM in line: get_dev_node(lines[i+1:], 'main') - if self.OSX_NAME_CARD_MEM is not None and line.strip().endswith('') and self.OSX_NAME_CARD_MEM in line: + if self.OSX_CARD_MEM is not None and line.strip().endswith('') and self.OSX_CARD_MEM in line: get_dev_node(lines[i+1:], 'card') if len(names.keys()) == 2: break From 0fc8aa3f4a7e57a3697b7262d47e547c7eae1071 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 10 Jan 2009 09:34:08 -0800 Subject: [PATCH 17/37] Recipe for Common Dreams by XanthanGum --- src/calibre/web/feeds/recipes/__init__.py | 2 +- .../web/feeds/recipes/recipe_common_dreams.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/calibre/web/feeds/recipes/recipe_common_dreams.py diff --git a/src/calibre/web/feeds/recipes/__init__.py b/src/calibre/web/feeds/recipes/__init__.py index d9ecce0e72..362bfeeafc 100644 --- a/src/calibre/web/feeds/recipes/__init__.py +++ b/src/calibre/web/feeds/recipes/__init__.py @@ -21,7 +21,7 @@ recipe_modules = ['recipe_' + r for r in ( 'linux_magazine', 'telegraph_uk', 'utne', 'sciencedaily', 'forbes', 'time_magazine', 'endgadget', 'fudzilla', 'nspm_int', 'nspm', 'pescanik', 'spiegel_int', 'themarketticker', 'tomshardware', 'xkcd', 'ftd', 'zdnet', - 'joelonsoftware', 'telepolis', + 'joelonsoftware', 'telepolis', 'common_dreams', )] import re, imp, inspect, time, os diff --git a/src/calibre/web/feeds/recipes/recipe_common_dreams.py b/src/calibre/web/feeds/recipes/recipe_common_dreams.py new file mode 100644 index 0000000000..18a4233d69 --- /dev/null +++ b/src/calibre/web/feeds/recipes/recipe_common_dreams.py @@ -0,0 +1,16 @@ + +from calibre.web.feeds.news import BasicNewsRecipe + +class CommonDreams(BasicNewsRecipe): + title = u'Common Dreams' + description = u'Progressive news and views' + __author__ = u'XanthanGum' + oldest_article = 7 + max_articles_per_feed = 100 + + feeds = [ + (u'Common Dreams Headlines', + u'http://www.commondreams.org/feed/headlines_rss'), + (u'Common Dreams Views', u'http://www.commondreams.org/feed/views_rss'), + (u'Common Dreams Newswire', u'http://www.commondreams.org/feed/newswire_rss') + ] From 2504d194abcc1d765d7d4cd891dc6066e630826c Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 10 Jan 2009 17:49:45 -0500 Subject: [PATCH 18/37] Fix else if --- src/calibre/devices/usbms/device.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 128bc58ec5..0c189da63b 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -178,7 +178,7 @@ class Device(_Device): for drive in c.Win32_DiskDrive(): if self.windows_match_device(str(drive.PNPDeviceID), WINDOWS_MAIN_MEM): drives['main'] = self.windows_get_drive_prefix(drive) - else if self.windows_match_device(str(drive.PNPDeviceID), WINDOWS_CARD_MEM): + elif self.windows_match_device(str(drive.PNPDeviceID), WINDOWS_CARD_MEM): drives['card'] = self.windows_get_drive_prefix(drive) if 'main' and 'card' in drives.keys(): From 399b6bbcb0c2ff341e3706f8c0f5b48a602516ad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 10 Jan 2009 16:28:09 -0800 Subject: [PATCH 19/37] Fix #1588 (Recipe for "The Economist") --- src/calibre/web/feeds/recipes/recipe_economist.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/web/feeds/recipes/recipe_economist.py b/src/calibre/web/feeds/recipes/recipe_economist.py index 3c75bd4237..9ed19802b4 100644 --- a/src/calibre/web/feeds/recipes/recipe_economist.py +++ b/src/calibre/web/feeds/recipes/recipe_economist.py @@ -49,8 +49,10 @@ class Economist(BasicNewsRecipe): if not index_started: continue text = string.capwords(text) - feeds[text] = [] - ans.append(text) + if text not in feeds.keys(): + feeds[text] = [] + if text not in ans: + ans.append(text) key = text continue if key is None: From 719926222ec9cbd8b03da5872dc4ffb26636e749 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 10 Jan 2009 17:01:11 -0800 Subject: [PATCH 20/37] IGN:Allow drivers to perform arbitrary post id match checks to detect devices --- src/calibre/devices/interface.py | 14 ++++++++++++++ src/calibre/devices/scanner.py | 6 ++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index 85d25d82a4..04d61a25dc 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -41,6 +41,20 @@ class Device(object): '''Return the FDI description of this device for HAL on linux.''' return '' + @classmethod + def can_handle(cls, device_info): + ''' + Optional method to perform further checks on a device to see if this driver + is capable of handling it. If it is not it should return False. This method + is only called after the vendor, product ids and the bcd have matched, so + it can do some relatively time intensive checks. The default implementation + returns True. + + :param device_info: On windows a device ID string. On Unix a tuple of + ``(vendor_id, product_id, bcd)``. + ''' + return True + def open(self): ''' Perform any device specific initialization. Called after the device is diff --git a/src/calibre/devices/scanner.py b/src/calibre/devices/scanner.py index ec937fc84d..26ea67ea44 100644 --- a/src/calibre/devices/scanner.py +++ b/src/calibre/devices/scanner.py @@ -63,12 +63,14 @@ class DeviceScanner(object): for device_id in self.devices: if vid in device_id and pid in device_id: if self.test_bcd_windows(device_id, getattr(device, 'BCD', None)): - return True + if device.can_handle(device_id): + return True else: for vendor, product, bcdDevice in self.devices: if device.VENDOR_ID == vendor and device.PRODUCT_ID == product: if self.test_bcd(bcdDevice, getattr(device, 'BCD', None)): - return True + if device.can_handle((vendor, product, bcdDevice)): + return True return False From a8d7678eedee239afbd455114969a20ae14be8b2 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sun, 11 Jan 2009 10:30:09 -0500 Subject: [PATCH 21/37] Add subprocess import --- src/calibre/devices/usbms/device.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 0c189da63b..c1dd56385a 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -6,7 +6,7 @@ intended to be subclassed with the relevant parts implemented for a particular device. This class handles devive detection. ''' -import os, time +import os, subprocess, time from calibre.devices.interface import Device as _Device from calibre.devices.errors import DeviceError @@ -150,13 +150,14 @@ class Device(_Device): return (msz, 0, csz) def windows_match_device(self, pnp_id, device_id): + pnp_id = pnp_id.upper() + if device_id and pnp_id is not None: - pnp_id = pnp_id.upper() device_id = device_id.upper() if 'VEN_' + self.VENDOR_NAME in pnp_id and 'PROD_' + device_id in pnp_id: return True - + return False def windows_get_drive_prefix(self, drive): From 910e2de0346ab84685d524c26c33799f9d9805a6 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sun, 11 Jan 2009 19:34:44 -0500 Subject: [PATCH 22/37] Global mime mapping for ebook types --- src/calibre/devices/cybookg3/driver.py | 11 ++--------- src/calibre/devices/kindle/driver.py | 8 +------- src/calibre/devices/usbms/driver.py | 13 +++++++------ 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/calibre/devices/cybookg3/driver.py b/src/calibre/devices/cybookg3/driver.py index 7ab9a909a0..3737de3d7d 100644 --- a/src/calibre/devices/cybookg3/driver.py +++ b/src/calibre/devices/cybookg3/driver.py @@ -9,16 +9,9 @@ import os, fnmatch from calibre.devices.usbms.driver import USBMS class CYBOOKG3(USBMS): - MIME_MAP = { - 'mobi' : 'application/mobi', - 'prc' : 'application/prc', - 'html' : 'application/html', - 'pdf' : 'application/pdf', - 'rtf' : 'application/rtf', - 'txt' : 'text/plain', - } # Ordered list of supported formats - FORMATS = MIME_MAP.keys() + # Be sure these have an entry in calibre.devices.mime + FORMATS = ['mobi', 'prc', 'html', 'pdf', 'rtf', 'txt'] VENDOR_ID = 0x0bda PRODUCT_ID = 0x0703 diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index 4313f24847..d5ef7008bc 100755 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -9,14 +9,8 @@ import os, fnmatch from calibre.devices.usbms.driver import USBMS class KINDLE(USBMS): - MIME_MAP = { - 'azw' : 'application/azw', - 'mobi' : 'application/mobi', - 'prc' : 'application/prc', - 'txt' : 'text/plain', - } # Ordered list of supported formats - FORMATS = MIME_MAP.keys() + FORMATS = ['azw', 'mobi', 'prc', 'txt'] VENDOR_ID = 0x1949 PRODUCT_ID = 0x0001 diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index ba89db29c9..7e5706f4ea 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -12,11 +12,11 @@ from itertools import cycle from calibre.devices.usbms.device import Device from calibre.devices.usbms.books import BookList, Book from calibre.devices.errors import FreeSpaceError +from calibre.devices.mime import MIME_MAP class USBMS(Device): EBOOK_DIR_MAIN = '' EBOOK_DIR_CARD = '' - MIME_MAP = {} FORMATS = [] def __init__(self, key='-1', log_packets=False, report_progress=None): @@ -41,7 +41,7 @@ class USBMS(Device): # Get all books in all directories under the root ebook_dir directory for path, dirs, files in os.walk(os.path.join(prefix, ebook_dir)): # Filter out anything that isn't in the list of supported ebook types - for book_type in self.MIME_MAP.keys(): + for book_type in self.FORMATS: for filename in fnmatch.filter(files, '*.%s' % (book_type)): title, author, mime = self.__class__.extract_book_metadata_by_filename(filename) @@ -138,10 +138,11 @@ class USBMS(Device): else: book_title = os.path.splitext(filename)[0].replace('_', ' ') - fileext = os.path.splitext(filename)[1] - if fileext in cls.MIME_MAP.keys(): - book_mime = cls.MIME_MAP[fileext] - + fileext = os.path.splitext(filename)[1][1:] + + if fileext in cls.FORMATS: + book_mime = MIME_MAP[fileext] if fileext in MIME_MAP.keys() else 'Unknown' + return book_title, book_author, book_mime # ls, rm, cp, mkdir, touch, cat From ddea057ed23aac532c12959dd2e42218584a53d9 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sun, 11 Jan 2009 19:48:31 -0500 Subject: [PATCH 23/37] Global mime mapping for ebook types --- src/calibre/devices/mime.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/calibre/devices/mime.py diff --git a/src/calibre/devices/mime.py b/src/calibre/devices/mime.py new file mode 100644 index 0000000000..0035a7b8d7 --- /dev/null +++ b/src/calibre/devices/mime.py @@ -0,0 +1,19 @@ +__license__ = 'GPL v3' +__copyright__ = '2009, John Schember ' +''' +Global Mime mapping of ebook types. +''' + +MIME_MAP = { + 'azw' : 'application/azw', + 'epub' : 'application/epub+zip', + 'html' : 'text/html', + 'lrf' : 'application/x-sony-bbeb', + 'lrx' : 'application/x-sony-bbeb', + 'mobi' : 'application/mobi', + 'pdf' : 'application/pdf', + 'prc' : 'application/prc', + 'rtf' : 'application/rtf', + 'txt' : 'text/plain', + } + From 4cea46d7a6fa81b8be3e6e1638371af143709319 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 08:01:50 -0800 Subject: [PATCH 24/37] New recipe for NIN by Darko Miletic --- src/calibre/web/feeds/recipes/__init__.py | 2 +- src/calibre/web/feeds/recipes/recipe_nin.py | 55 +++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/calibre/web/feeds/recipes/recipe_nin.py diff --git a/src/calibre/web/feeds/recipes/__init__.py b/src/calibre/web/feeds/recipes/__init__.py index 362bfeeafc..0c6e48131e 100644 --- a/src/calibre/web/feeds/recipes/__init__.py +++ b/src/calibre/web/feeds/recipes/__init__.py @@ -21,7 +21,7 @@ recipe_modules = ['recipe_' + r for r in ( 'linux_magazine', 'telegraph_uk', 'utne', 'sciencedaily', 'forbes', 'time_magazine', 'endgadget', 'fudzilla', 'nspm_int', 'nspm', 'pescanik', 'spiegel_int', 'themarketticker', 'tomshardware', 'xkcd', 'ftd', 'zdnet', - 'joelonsoftware', 'telepolis', 'common_dreams', + 'joelonsoftware', 'telepolis', 'common_dreams', 'nin', )] import re, imp, inspect, time, os diff --git a/src/calibre/web/feeds/recipes/recipe_nin.py b/src/calibre/web/feeds/recipes/recipe_nin.py new file mode 100644 index 0000000000..65195b5616 --- /dev/null +++ b/src/calibre/web/feeds/recipes/recipe_nin.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2008, Darko Miletic ' +''' +nin.co.yu +''' + +import re, urllib +from calibre.web.feeds.news import BasicNewsRecipe + +class Nin(BasicNewsRecipe): + title = 'NIN online' + __author__ = 'Darko Miletic' + description = 'Nedeljne informativne novine' + no_stylesheets = True + oldest_article = 15 + simultaneous_downloads = 1 + delay = 1 + encoding = 'utf8' + needs_subscription = True + PREFIX = 'http://www.nin.co.yu' + INDEX = PREFIX + '/?change_lang=ls' + LOGIN = PREFIX + '/?logout=true' + html2lrf_options = [ + '--comment' , description + , '--category' , 'news, politics, Serbia' + , '--publisher' , 'NIN' + ] + + preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + br.open(self.INDEX) + if self.username is not None and self.password is not None: + data = urllib.urlencode({ 'login_name':self.username + ,'login_password':self.password + ,'imageField.x':'32' + ,'imageField.y':'15' + }) + br.open(self.LOGIN,data) + return br + + keep_only_tags =[dict(name='td', attrs={'width':'520'})] + remove_tags_after =dict(name='html') + feeds =[(u'NIN', u'http://www.nin.co.yu/misc/rss.php?feed=RSS2.0')] + + def get_cover_url(self): + cover_url = None + soup = self.index_to_soup(self.INDEX) + link_item = soup.find('img',attrs={'width':'100','height':'137','border':'0'}) + if link_item: + cover_url = self.PREFIX + link_item['src'] + return cover_url From 2fdcf2046e5e7f1802ed9f88454a4bd569022446 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 08:03:47 -0800 Subject: [PATCH 25/37] IGN:... --- src/calibre/ebooks/lrf/comic/convert_from.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/lrf/comic/convert_from.py b/src/calibre/ebooks/lrf/comic/convert_from.py index fa004d1a16..0569bf3733 100755 --- a/src/calibre/ebooks/lrf/comic/convert_from.py +++ b/src/calibre/ebooks/lrf/comic/convert_from.py @@ -443,7 +443,7 @@ def do_convert(path_to_file, opts, notification=lambda m, p: p, output_format='l if output_format == 'pdf': create_pdf(pages, opts.profile, opts, thumbnail=thumbnail) shutil.rmtree(tdir) - if not opts.no_process: + if not getattr(opts, 'no_process', False): shutil.rmtree(tdir2) @@ -457,7 +457,7 @@ def main(args=sys.argv, notification=None, output_format='lrf'): if not callable(notification): pb = ProgressBar(terminal_controller, _('Rendering comic pages...'), - no_progress_bar=opts.no_progress_bar) + no_progress_bar=opts.no_progress_bar or getattr(opts, 'no_process', False)) notification = pb.update source = os.path.abspath(args[1]) From cb890fc374983cb6c64b3819cfa6d91a92ba02d0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 08:04:19 -0800 Subject: [PATCH 26/37] IGN:Stability enhancements --- src/calibre/gui2/main.py | 3 +++ src/calibre/library/database2.py | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 97ad934eeb..1bb252e97d 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -889,6 +889,9 @@ class Main(MainWindow, Ui_MainWindow): ids = [id for id in ids if self.library_view.model().db.has_id(id)] files = [self.library_view.model().db.format(id, prefs['output_format'], index_is_id=True, as_file=True) for id in ids] files = [f for f in files if f is not None] + if not files: + dynamic.set('news_to_be_synced', set([])) + return metadata = self.library_view.model().get_metadata(ids, rows_are_ids=True) names = [] for mi in metadata: diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index d3cefa47fa..e39736baf6 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -217,7 +217,11 @@ class ResultCache(SearchQueryParser): return self.index(id) def has_id(self, id): - return self._data[id] is not None + try: + return self._data[id] is not None + except IndexError: + pass + return False def refresh_ids(self, conn, ids): for id in ids: From 4dc946d79b321f432868fcde1e6e5a1ac96dac5e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 12:32:32 -0800 Subject: [PATCH 27/37] Fix #1603 (traceback on adding multiple books from directories, each directory single book with multiple versions) --- src/calibre/library/database.py | 3 --- src/calibre/library/database2.py | 10 +++++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index f14a1174fc..ecf272618f 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1551,9 +1551,6 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; - def has_book(self, mi): - return bool(self.conn.get('SELECT id FROM books where title=?', (mi.title,), all=False)) - def has_id(self, id): return self.conn.get('SELECT id FROM books where id=?', (id,), all=False) is not None diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index e39736baf6..da41dba57f 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -561,7 +561,15 @@ class LibraryDatabase2(LibraryDatabase): img.loadFromData(f.read()) return img return f if as_file else f.read() - + + def has_book(self, mi): + title = mi.title + if title: + if not isinstance(title, unicode): + title = title.decode(preferred_encoding, 'replace') + return bool(self.conn.get('SELECT id FROM books where title=?', (title,), all=False)) + return False + def has_cover(self, index, index_is_id=False): id = index if index_is_id else self.id(index) path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') From e4833b7835ad0daa735ea197562ef79a4567235e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 13:15:03 -0800 Subject: [PATCH 28/37] Fix #1604 (index error) --- src/calibre/gui2/lrf_renderer/document.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/lrf_renderer/document.py b/src/calibre/gui2/lrf_renderer/document.py index 691e1481ee..76c94d23f1 100644 --- a/src/calibre/gui2/lrf_renderer/document.py +++ b/src/calibre/gui2/lrf_renderer/document.py @@ -406,7 +406,8 @@ class Document(QGraphicsScene): for font in lrf.font_map: fdata = QByteArray(lrf.font_map[font].data) id = QFontDatabase.addApplicationFontFromData(fdata) - font_map[font] = [str(i) for i in QFontDatabase.applicationFontFamilies(id)][0] + if id != -1: + font_map[font] = [str(i) for i in QFontDatabase.applicationFontFamilies(id)][0] if load_substitutions: from calibre.ebooks.lrf.fonts.liberation import LiberationMono_BoldItalic From 71dea7b4ee05eefd5b1d4fb350b4ccd0ee79a024 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 16:52:50 -0800 Subject: [PATCH 29/37] Fix #1410 (Error using preview on downloaded news) --- src/calibre/debug.py | 6 +++++- src/calibre/ebooks/lrf/objects.py | 4 +++- src/calibre/utils/zipfile.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/calibre/debug.py b/src/calibre/debug.py index 274089baa1..81336953e1 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -43,7 +43,11 @@ def update_module(mod, path): 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') + 'Resources', 'lib', + 'python'+'.'.join(map(str, sys.version_info[:2])), + 'site-packages.zip') + else: + zp = os.path.join(getattr(sys, 'frozen_path'), 'loader.zip') if zp is not None: update_zipfile(zp, mod, path) else: diff --git a/src/calibre/ebooks/lrf/objects.py b/src/calibre/ebooks/lrf/objects.py index 29c0d8de44..23ee62c0b5 100644 --- a/src/calibre/ebooks/lrf/objects.py +++ b/src/calibre/ebooks/lrf/objects.py @@ -1166,7 +1166,9 @@ class TOCObject(LRFStream): refpage = struct.unpack(" Date: Mon, 12 Jan 2009 17:06:04 -0800 Subject: [PATCH 30/37] Implement #1428 (Suppress source file page breaks.) --- src/calibre/ebooks/html.py | 2 +- src/calibre/ebooks/lrf/html/convert_from.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/html.py b/src/calibre/ebooks/html.py index b80f05ef60..f14e153057 100644 --- a/src/calibre/ebooks/html.py +++ b/src/calibre/ebooks/html.py @@ -335,7 +335,7 @@ class PreProcessor(object): # Fix pdftohtml markup PDFTOHTML = [ # Remove
tags - (re.compile(r'', re.IGNORECASE), lambda match: ' '), + (re.compile(r'', re.IGNORECASE), lambda match: '
'), # Remove page numbers (re.compile(r'\d+
', re.IGNORECASE), lambda match: ''), # Remove
and replace

with

diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 292ae0b50b..b301854684 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -122,7 +122,7 @@ class HTMLConverter(object, LoggingInterface): # Fix pdftohtml markup PDFTOHTML = [ # Remove


tags - (re.compile(r'', re.IGNORECASE), lambda match: ' '), + (re.compile(r'', re.IGNORECASE), lambda match: '
'), # Remove page numbers (re.compile(r'\d+
', re.IGNORECASE), lambda match: ''), # Remove
and replace

with

From 4741e10a7a2ec484d22351c1eef65b3d7d187e72 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 18:29:36 -0800 Subject: [PATCH 31/37] Fix #1439 (Sort is not saved when quitting) --- src/calibre/gui2/main.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 1bb252e97d..5429fb15c1 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1482,8 +1482,9 @@ in which you want to store your books files. Any existing books will be automati return True - def shutdown(self): - self.write_settings() + def shutdown(self, write_settings=True): + if write_settings: + self.write_settings() self.job_manager.terminate_all_jobs() self.device_manager.keep_going = False self.cover_cache.stop() @@ -1503,6 +1504,7 @@ in which you want to store your books files. Any existing books will be automati def closeEvent(self, e): + self.write_settings() if self.system_tray_icon.isVisible(): if not dynamic['systray_msg'] and not isosx: info_dialog(self, 'calibre', 'calibre '+_('will keep running in the system tray. To close it, choose Quit in the context menu of the system tray.')).exec_() @@ -1512,7 +1514,7 @@ in which you want to store your books files. Any existing books will be automati else: if self.confirm_quit(): try: - self.shutdown() + self.shutdown(write_settings=False) except: pass e.accept() From 87657c6fd43af1f78a50d6c6a61d57c990e902c3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 18:50:19 -0800 Subject: [PATCH 32/37] Fix #1606 (Accented o (with tilde) makes lrfviewer croak) --- src/calibre/ebooks/lrf/objects.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/lrf/objects.py b/src/calibre/ebooks/lrf/objects.py index 23ee62c0b5..8a3c814141 100644 --- a/src/calibre/ebooks/lrf/objects.py +++ b/src/calibre/ebooks/lrf/objects.py @@ -698,9 +698,12 @@ class Text(LRFStream): lineposition_map = {1:'before', 2:'after'} def add_text(self, text): - s = unicode(text, "utf-16-le") + try: + s = unicode(text, "utf-16-le") + except UnicodeDecodeError: # Work around for Book Designer + s = unicode(text+'\x00', 'utf-16-le') if s: - s = s.translate(self.text_map) + s = s.translate(self.text_map) self.content.append(self.entity_pattern.sub(entity_to_unicode, s)) def end_container(self, tag, stream): From 451986a9cefb2df17bfb0665b839da749a9c1038 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Jan 2009 20:57:54 -0800 Subject: [PATCH 33/37] Improve support in lrfviewer for LRF files that are created by badly programmed software that puts unicode strings directly into text streams. BookDesigner, I'm looking at you! lrfviewer now handles a much larger range of such unicode characters in text streams. --- src/calibre/ebooks/lrf/objects.py | 41 ++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/lrf/objects.py b/src/calibre/ebooks/lrf/objects.py index 8a3c814141..ff9edc4e47 100644 --- a/src/calibre/ebooks/lrf/objects.py +++ b/src/calibre/ebooks/lrf/objects.py @@ -698,10 +698,7 @@ class Text(LRFStream): lineposition_map = {1:'before', 2:'after'} def add_text(self, text): - try: - s = unicode(text, "utf-16-le") - except UnicodeDecodeError: # Work around for Book Designer - s = unicode(text+'\x00', 'utf-16-le') + s = unicode(text, "utf-16-le") if s: s = s.translate(self.text_map) self.content.append(self.entity_pattern.sub(entity_to_unicode, s)) @@ -802,18 +799,39 @@ class Text(LRFStream): length = len(self.stream) style = self.style.as_dict() current_style = style.copy() + text_tags = set(list(TextAttr.tag_map.keys()) + \ + list(Text.text_tags.keys()) + \ + list(ruby_tags.keys())) + text_tags -= set([0xf500+i for i in range(10)]) + text_tags.add(0xf5cc) while stream.tell() < length: - # Is there some text beofre a tag? - pos = self.stream.find('\xf5', stream.tell()) - 1 - if pos > 0: - self.add_text(self.stream[stream.tell():pos]) - stream.seek(pos) - elif pos == -2: # No tags in this stream + # Is there some text before a tag? + def find_first_tag(start): + pos = self.stream.find('\xf5', start) + if pos == -1: + return -1 + try: + stream.seek(pos-1) + _t = Tag(stream) + if _t.id in text_tags: + return pos-1 + return find_first_tag(pos+1) + + + except: + return find_first_tag(pos+1) + + start_pos = stream.tell() + tag_pos = find_first_tag(start_pos) + if tag_pos >= start_pos: + if tag_pos > start_pos: + self.add_text(self.stream[start_pos:tag_pos]) + stream.seek(tag_pos) + else: # No tags in this stream self.add_text(self.stream) stream.seek(0, 2) - print repr(self.stream) break tag = Tag(stream) @@ -1170,7 +1188,6 @@ class TOCObject(LRFStream): refobj = struct.unpack(" Date: Mon, 12 Jan 2009 23:26:10 -0800 Subject: [PATCH 34/37] IGN:Updated translations --- src/calibre/translations/bg.po | 1616 +++++++++++++++------------- src/calibre/translations/ca.po | 1555 +++++++++++++++------------ src/calibre/translations/cs.po | 1642 +++++++++++++++------------- src/calibre/translations/de.po | 1692 ++++++++++++++++------------- src/calibre/translations/el.po | 1616 +++++++++++++++------------- src/calibre/translations/es.po | 1549 +++++++++++++++------------ src/calibre/translations/fr.po | 1549 +++++++++++++++------------ src/calibre/translations/gl.po | 1616 +++++++++++++++------------- src/calibre/translations/it.po | 1603 +++++++++++++++------------- src/calibre/translations/nb.po | 1613 +++++++++++++++------------- src/calibre/translations/nds.po | 1692 ++++++++++++++++------------- src/calibre/translations/nl.po | 1549 +++++++++++++++------------ src/calibre/translations/pl.po | 1754 ++++++++++++++++-------------- src/calibre/translations/pt.po | 1688 ++++++++++++++++------------- src/calibre/translations/ro.po | 1616 +++++++++++++++------------- src/calibre/translations/ru.po | 1608 +++++++++++++++------------- src/calibre/translations/sk.po | 1777 +++++++++++++++++-------------- src/calibre/translations/sl.po | 1549 +++++++++++++++------------ src/calibre/translations/sv.po | 1616 +++++++++++++++------------- src/calibre/translations/te.po | 1616 +++++++++++++++------------- 20 files changed, 17738 insertions(+), 14778 deletions(-) diff --git a/src/calibre/translations/bg.po b/src/calibre/translations/bg.po index cc9a7935d0..45a3feb12b 100644 --- a/src/calibre/translations/bg.po +++ b/src/calibre/translations/bg.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.51\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-12-30 15:33+0000\n" +"POT-Creation-Date: 2009-01-10 01:19+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: 2009-01-07 18:40+0000\n" +"X-Launchpad-Export-Date: 2009-01-13 07:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -23,14 +23,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_any.py:44 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:478 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:948 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:961 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:492 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:965 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:978 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:81 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:292 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:300 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:95 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:97 @@ -49,7 +49,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:334 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:449 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:793 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:819 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:12 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/to_oeb.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 @@ -58,20 +58,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:365 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:38 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:329 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:343 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:835 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:915 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:112 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:709 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:116 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:257 #: /home/kovid/work/calibre/src/calibre/library/database.py:920 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1392 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1423 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1452 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1580 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1404 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1435 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1464 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1592 #: /home/kovid/work/calibre/src/calibre/library/database2.py:461 #: /home/kovid/work/calibre/src/calibre/library/database2.py:473 #: /home/kovid/work/calibre/src/calibre/library/database2.py:808 @@ -103,33 +103,38 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:32 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:42 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:43 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:63 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:73 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:83 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:64 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:74 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:84 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:105 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:115 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:125 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:135 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:145 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:126 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:136 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:146 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:156 msgid "Read metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:155 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:166 msgid "Extract cover from comic files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:175 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:186 +msgid "Read metadata from ebooks in ZIP archives" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:196 msgid "Set metadata in EPUB files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:206 msgid "Set metadata in LRF files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:216 msgid "Set metadata in RTF files" msgstr "" @@ -153,11 +158,11 @@ msgstr "" msgid "No valid plugin found in " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:170 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:184 msgid "Initialization of plugin %s failed with traceback:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:247 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:261 msgid "" " %prog options\n" " \n" @@ -165,29 +170,29 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:253 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:267 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:269 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:257 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:271 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:273 msgid "List all installed plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:261 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:275 msgid "Enable the named plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:263 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:277 msgid "Disable the named plugin" msgstr "" @@ -195,13 +200,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:158 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:196 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:224 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:182 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:223 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:250 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:412 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:51 msgid "The reader has no storage card connected." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:62 +msgid "There is insufficient free space on the storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +msgid "There is insufficient free space in main memory" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:92 msgid "Options to control the conversion to EPUB" msgstr "" @@ -261,7 +278,16 @@ msgid "" "cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:126 +msgid "" +"Turn off splitting at page breaks. Normally, input files are automatically " +"split at every page break into two files. This gives an output ebook that " +"can be parsed faster and with less resources. However, splitting is slow and " +"if your source file contains a very large number of page breaks, you should " +"turn off splitting on page breaks." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:128 msgid "" "Control the automatic generation of a Table of Contents. If an OPF file is " "detected\n" @@ -270,38 +296,38 @@ msgid "" "to auto-generate a Table of Contents.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:134 msgid "" "Maximum number of links to insert into the TOC. Set to 0 to disable. Default " "is: %default. Links are only added to the TOC if less than the --toc-" "threshold number of chapters were detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:136 msgid "Don't add auto-detected chapters to the Table of Contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:138 msgid "" "If fewer than this number of chapters is detected, then links are added to " "the Table of Contents. Default: %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:140 msgid "" "XPath expression that specifies all tags that should be added to the Table " "of Contents at level one. If this is specified, it takes precedence over " "other forms of auto-detection." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:142 msgid "" "XPath expression that specifies all tags that should be added to the Table " "of Contents at level two. Each entry is added under the previous level one " "entry." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:144 msgid "" "Path to a .ncx file that contains the table of contents to use for this " "ebook. The NCX file should contain links relative to the directory it is " @@ -309,65 +335,65 @@ msgid "" "an overview of the NCX format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:146 msgid "" "Normally, if the source file already has a Table of Contents, it is used in " "preference to the autodetected one. With this option, the autodetected one " "is always used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:147 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:148 msgid "Control page layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:150 msgid "Set the top margin in pts. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:152 msgid "Set the bottom margin in pts. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:154 msgid "Set the left margin in pts. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:155 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:156 msgid "Set the right margin in pts. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:157 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:158 msgid "" "The base font size in pts. Default is %defaultpt. Set to 0 to disable " "rescaling of fonts." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:160 msgid "" "Remove spacing between paragraphs. Will not work if the source file forces " "inter-paragraph spacing." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:162 msgid "" "Preserve the HTML tag structure while splitting large HTML files. This is " "only neccessary if the HTML files contain CSS that uses sibling selectors. " "Enabling this greatly slows down processing of large HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:165 msgid "Print generated OPF file to stdout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:166 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:167 msgid "Print generated NCX file to stdout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:168 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:169 msgid "Keep intermediate files during processing by html2epub" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:171 msgid "" "Extract the contents of the produced EPUB file to the specified directory." msgstr "" @@ -384,7 +410,7 @@ msgstr "" msgid "Could not find an ebook inside the archive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:158 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:162 msgid "" "%prog [options] file.html|opf\n" "\n" @@ -395,13 +421,13 @@ msgid "" "the element of the OPF file. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:413 #: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:739 msgid "Output written to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:413 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:1046 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:435 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:1063 msgid "You must specify an input HTML file" msgstr "" @@ -414,100 +440,99 @@ msgid "" "Could not find reasonable point at which to split: %s Sub-tree size: %d KB" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/split.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/split.py:140 msgid "" "\t\tToo much markup. Re-splitting without structure preservation. This may " "cause incorrect rendering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:490 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:504 msgid "Written processed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:831 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:848 msgid "Options to control the traversal of HTML" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:838 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:855 msgid "The output directory. Default is the current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:840 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:857 msgid "Character encoding for HTML files. Default is to auto detect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:842 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:859 msgid "" "Create the output in a zip file. If this option is specified, the --output " "should be the name of a file not a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:844 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:861 msgid "Control the following of links in HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:846 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:863 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:848 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:865 msgid "" "Maximum levels of recursion when following links in HTML files. Must be non-" "negative. 0 implies that no links in the root HTML file are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:850 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:867 msgid "Set metadata of the generated ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:852 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:869 msgid "Set the title. Default is to autodetect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:854 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:871 msgid "The author(s) of the ebook, as a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:856 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:873 msgid "The subject(s) of this book, as a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:858 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:875 msgid "Set the publisher of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:860 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:877 msgid "A summary of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:862 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:879 msgid "Load metadata from the specified OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:864 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:881 msgid "Options useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:866 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:883 msgid "" "Be more verbose while processing. Can be specified multiple times to " "increase verbosity." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:868 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:885 msgid "Output HTML is \"pretty printed\" for easier parsing by humans" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:874 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:891 msgid "" "%prog [options] file.html|opf\n" "\n" "Follow all links in an HTML file and collect them into the specified " "directory.\n" -"Also collects any references resources like images, stylesheets, scripts, " -"etc. \n" +"Also collects any resources like images, stylesheets, scripts, etc. \n" "If an OPF file is specified instead, the list of files in its " "element\n" "is used.\n" @@ -522,7 +547,7 @@ msgid "%prog [options] LITFILE" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:852 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:444 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:475 msgid "Output directory. Defaults to current directory." msgstr "" @@ -536,7 +561,7 @@ msgid "Useful for debugging." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:869 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:468 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:499 msgid "OEB ebook created in" msgstr "" @@ -577,7 +602,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:87 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:108 msgid "Publisher" msgstr "" @@ -631,100 +656,104 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:112 +msgid "Add extra spacing below the header. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:114 msgid "" "Override the CSS. Can be either a path to a CSS stylesheet or a string. If " "it is a string it is interpreted as CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:114 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:116 msgid "" "Use the element from the OPF file to determine the order in which " "the HTML files are appended to the LRF. The .opf file must be in the same " "directory as the base HTML file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:116 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:118 msgid "" "Minimum paragraph indent (the indent of the first line of a paragraph) in " "pts. Default: %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:118 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:120 msgid "" "Increase the font size by 2 * FONT_DELTA pts and the line spacing by " "FONT_DELTA pts. FONT_DELTA can be a fraction.If FONT_DELTA is negative, the " "font size is decreased." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:125 msgid "" "Render all content as black on white instead of the colors specified by the " "HTML or CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:131 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " "device. Default: %s Supported profiles: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 msgid "Left margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 msgid "Right margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 msgid "Top margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:143 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 msgid "" "Render tables in the HTML as images (useful if the document has large or " "complex tables)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:147 msgid "" "Multiply the size of text in rendered tables by this factor. Default is " "%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:150 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:152 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:154 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:156 msgid "" "A regular expression. tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:158 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:160 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:162 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:165 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:168 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:170 msgid "" "Detect a chapter beginning at an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -734,7 +763,7 @@ msgid "" "all h2 tags, you would use \"h2,none,\". Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:172 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -745,12 +774,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -758,25 +787,25 @@ msgid "" "class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:190 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:190 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:192 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:192 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:195 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -784,33 +813,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:206 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:215 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:217 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:217 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:219 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:221 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -837,114 +866,120 @@ msgstr "" msgid "No file to convert specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:221 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:229 msgid "Rendered %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:224 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:232 msgid "Failed %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:284 msgid "" "Failed to process comic: %s\n" "\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:291 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:289 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:297 msgid "Title for generated ebook. Default is to use the filename." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:291 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:299 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:294 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:302 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:22 msgid "" "Path to output file. By default a file is created in the current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:296 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:304 msgid "Number of colors for grayscale image conversion. Default: %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:298 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:306 msgid "" "Disable normalize (improve contrast) color range for pictures. Default: False" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:308 msgid "Maintain picture aspect ratio. Default is to fill the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:302 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:310 msgid "Disable sharpening." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:312 msgid "Don't split landscape images into two portrait images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:314 msgid "" "Keep aspect ratio and scale image using screen height as image width for " "viewing in landscape mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:308 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:316 msgid "" "Used for right-to-left publications like manga. Causes landscape pages to be " "split into portrait pages from right to left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:310 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:318 msgid "" "Enable Despeckle. Reduces speckle noise. May greatly increase processing " "time." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:312 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:320 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:314 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:322 msgid "" "Choose a profile for the device you are generating this file for. The " "default is the SONY PRS-500 with a screen size of 584x754 pixels. This is " "suitable for any reader with the same screen size. Choices are %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:316 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:324 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:20 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:318 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:326 msgid "Don't show progress bar." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:323 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:329 +msgid "Apply no processing to the image" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 msgid "" "%prog [options] comic.cb[z|r]\n" "\n" "Convert a comic in a CBZ or CBR file to an ebook. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:383 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:394 msgid "Output written to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:426 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:459 msgid "Rendering comic pages..." msgstr "" @@ -985,95 +1020,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:313 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:320 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:343 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:338 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:359 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:354 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:377 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:537 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:532 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:545 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:537 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:562 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:557 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:606 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:601 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:958 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:953 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:996 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:991 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1011 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1006 msgid "" "Could not process image: %s\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:1759 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:1770 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1761 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1792 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1783 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1822 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1813 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:1865 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1856 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1868 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1859 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:2003 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:2009 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1990 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -1092,25 +1127,29 @@ msgid "" "%prog converts mybook.lit to mybook.lrf" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:134 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:136 msgid "" "%prog book.lrf\n" "Convert an LRF file into an LRS (XML UTF-8 encoded) file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:137 msgid "Output LRS file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:153 -msgid "Parsing LRF..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:156 -msgid "Creating XML..." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:139 +msgid "Do not save embedded image and font files to disk" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:158 +msgid "Parsing LRF..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:161 +msgid "Creating XML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:163 msgid "LRS written to " msgstr "" @@ -1185,20 +1224,32 @@ msgstr "" msgid "Extract thumbnail from LRF file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606 +msgid "Set the publisher" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607 +msgid "Set the book classification" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608 +msgid "Set the book creator" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609 +msgid "Set the book producer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611 msgid "" "Extract cover from LRF file. Note that the LRF format has no defined cover, " "so we use some heuristics to guess the cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:613 msgid "Set book ID" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611 -msgid "Don't know what this is for" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/mobi/convert_from.py:43 msgid "" "Usage: %prog [options] mybook.mobi|prc\n" @@ -1272,17 +1323,17 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:69 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:326 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:931 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:274 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:932 msgid "Author(s)" msgstr "" @@ -1291,34 +1342,34 @@ msgid "Producer" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 msgid "Category" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:308 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:338 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:304 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:58 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:280 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:845 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:909 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:935 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 msgid "Tags" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:99 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:309 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 msgid "Series" @@ -1423,7 +1474,7 @@ msgstr "" msgid "Cover saved to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:938 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:964 msgid "Set the dc:language field" msgstr "" @@ -1435,11 +1486,11 @@ msgstr "" msgid "Usage: rb-meta file.rb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:442 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:473 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:466 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:497 msgid "Raw MOBI HTML saved in" msgstr "" @@ -1447,8 +1498,42 @@ msgstr "" msgid "The output directory. Defaults to the current directory." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:13 +msgid "Options to control the transformation of pdf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:24 +msgid "Number of pixels to crop from the left most x (default is %d) " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:26 +msgid "Number of pixels to crop from the left most y (default is %d) " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:28 +msgid "Number of pixels to crop from the right most x (default is %d) " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:30 +msgid "Number of pixels to crop from the right most y (default is %d)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:32 +msgid "" +"A file generated by ghostscript which allows each page to be individually " +"cropped [gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox > bounding] " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:38 +msgid "" +"\t%prog [options] file.pdf\n" +"\n" +"\tCrops a pdf. \n" +"\t" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:427 msgid "Frequently used directories" msgstr "" @@ -1520,14 +1605,20 @@ msgstr "" msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:60 msgid "Delete books from library after uploading to device" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:62 +msgid "" +"Show the cover flow in a separate window instead of in the main calibre " +"window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/device.py:72 msgid "Device no longer connected." msgstr "" @@ -1563,8 +1654,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:283 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:840 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:866 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:56 msgid "Path" msgstr "" @@ -1573,7 +1664,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:299 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 msgid "Formats" @@ -1627,8 +1718,8 @@ msgid "&Number of Colors:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 msgid "&Profile:" msgstr "" @@ -1694,122 +1785,123 @@ msgstr "" msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:256 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:257 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:260 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:272 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:282 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:283 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286 msgid "Customize %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:296 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:297 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:318 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:322 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:343 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:389 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:384 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:384 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:419 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:425 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:422 msgid "
Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:422 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:426 msgid "Invalid database location.
Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:438 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:438 msgid "Compacting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:411 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:329 msgid "Configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:412 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:413 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:411 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:426 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:428 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:439 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /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:288 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:303 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:314 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:318 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:352 #: /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 @@ -1823,196 +1915,200 @@ msgstr "" msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:415 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:416 msgid "" "If you disable this setting, metadata is guessed from the filename instead. " "This can be configured in the Advanced section." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:417 msgid "Read &metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:418 msgid "Format for &single file save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:419 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:420 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:418 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:421 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:422 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:423 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:424 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:425 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:426 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:428 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:430 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:432 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:433 msgid "&Number of covers to show in browse mode (after restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:434 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:435 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:436 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:437 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:438 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:439 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:440 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:440 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:443 msgid "Use internal &viewer for the following formats:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:444 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:445 msgid "Automatically send downloaded &news to ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:446 msgid "&Delete news from library when it is sent to reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:447 +msgid "Show cover &browser in a separate window (needs restart)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:448 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:449 msgid "&Compact database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:450 msgid "&Metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:451 msgid "" "calibre contains a network server that allows you to access your book " "collection using a browser from anywhere in the world. Any changes to the " "settings will only take effect after a server restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:452 msgid "Server &port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:453 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:146 msgid "&Username:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:454 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:147 msgid "&Password:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:455 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:148 msgid "&Show password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:453 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:457 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:458 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:459 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:460 msgid "St&op Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:461 msgid "&Test Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:462 msgid "Run server &automatically on startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:459 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:463 msgid "View &server logs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:464 msgid "" "If you want to use the content server to access your ebook collection on " "your iphone with Stanza, you will need to add the URL " @@ -2021,33 +2117,33 @@ msgid "" "address of this computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:461 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:465 msgid "" "Here you can customize the behavior of Calibre by controlling what plugins " "it uses." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:466 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:467 msgid "&Customize plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:464 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:468 msgid "&Remove plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:469 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:470 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:468 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:472 msgid "&Add" msgstr "" @@ -2130,25 +2226,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:59 msgid "Cannot read" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:60 msgid "You do not have permission to read the file: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:68 msgid "Error reading file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:69 msgid "

There was an error reading from file:
" msgstr "" @@ -2158,7 +2254,7 @@ msgid " is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:227 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1002 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1039 msgid "Cannot convert" msgstr "" @@ -2188,194 +2284,196 @@ msgstr "" msgid "The expression %s is invalid. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372 msgid "Convert to EPUB" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:347 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316 -msgid "Change &cover image:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317 -msgid "Browse for an image to use as the cover of this book." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375 -#: /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:279 -msgid "&Title: " +#: /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:348 +msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:376 -#: /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:280 -msgid "Change the title of this book" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 -msgid "&Author(s): " +#: /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:349 +msgid "Browse for an image to use as the cover of this book." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:311 +msgid "&Title: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:312 +msgid "Change the title of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:380 +#: /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:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:315 +msgid "&Author(s): " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:381 +#: /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:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "" "Change the author(s) of this book. Multiple authors should be separated by " "an &. If the author name contains an &, use && to represent it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:384 +#: /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:136 -#: /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:324 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:325 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:139 -#: /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:326 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:144 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:329 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:386 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:146 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:300 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:331 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:304 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:335 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:336 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:400 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:409 msgid " pt" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:398 msgid "Remove &spacing between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:399 msgid "Preserve &tag structure when splitting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:400 msgid "Override &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Left Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:401 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 msgid "&Right Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "&Top Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:405 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Bottom Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:410 +msgid "Do not &split on page breaks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:411 msgid "Automatic &chapter detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:412 msgid "&XPath:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:413 msgid "" "\n" @@ -2393,35 +2491,35 @@ msgid "" "tutorial

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:418 msgid "Chapter &mark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:419 msgid "Automatic &Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:420 msgid "Number of &links to add to Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:421 msgid "Do not add &detected chapters to the Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:422 msgid "Chapter &threshold" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:423 msgid "&Force use of auto-generated Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:424 msgid "Level &1 TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:425 msgid "Level &2 TOC" msgstr "" @@ -2514,7 +2612,7 @@ msgid "Convert %s to LRF" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:353 msgid "Set conversion defaults" msgstr "" @@ -2564,153 +2662,158 @@ msgstr "" msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Minimum &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "&Word spacing:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "&Preprocess:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "Header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Show header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 msgid "&Header format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 -msgid "Override
CSS" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:107 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:109 msgid " px" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +msgid "Header &separation:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 -msgid "&Convert tables to images (good for large/complex tables)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 -msgid "&Multiplier for text size in rendered tables:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 -msgid "Title based detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 -msgid "&Disable chapter detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 -msgid "&Regular expression:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 -msgid "Add &chapters to table of contents" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 -msgid "Don't add &links to the table of contents" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 -msgid "Tag based detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 -msgid "&Page break before tag:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 -msgid "&Force page break before tag:" +msgid "Override
CSS" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 -msgid "Force page break before &attribute:" +msgid "&Convert tables to images (good for large/complex tables)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 -msgid "Detect chapter &at tag:" +msgid "&Multiplier for text size in rendered tables:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 -msgid "Help on item" +msgid "Title based detection" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 +msgid "&Disable chapter detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 +msgid "&Regular expression:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Add &chapters to table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 +msgid "Don't add &links to the table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 +msgid "Tag based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:575 +msgid "&Page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:576 +msgid "&Force page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:577 +msgid "Force page break before &attribute:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:578 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:579 +msgid "Help on item" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:580 msgid "" "\n" "\n" +"\n" "

" +"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +"family:'DejaVu Sans';\">

" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 @@ -2718,36 +2821,36 @@ msgid "Edit Meta information" msgstr "" #: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:310 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130 -#: /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:316 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131 -#: /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:317 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:132 -#: /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:320 msgid "&Rating:" msgstr "" #: /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:290 -#: /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:321 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:322 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:135 -#: /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:323 msgid " stars" msgstr "" @@ -2757,8 +2860,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:328 msgid "Open Tag Editor" msgstr "" @@ -2778,80 +2881,105 @@ msgstr "" msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 +msgid "Could not read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +msgid "Could not read metadata from %s format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Could not read cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 +msgid "Could not read cover from %s format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:140 +msgid "The cover in the %s format is invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:321 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:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "Could not fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:357 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:357 msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /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:309 msgid "Edit Meta Information" msgstr "" -#: /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:313 msgid "Swap the author and title" msgstr "" -#: /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:318 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:332 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:337 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:339 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:340 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:341 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:343 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:345 +msgid "Set the cover for the book from the selected format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:351 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:353 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:354 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:323 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:355 msgid "Change password" msgstr "" @@ -2863,49 +2991,49 @@ msgstr "" msgid "You" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:218 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:235 msgid "%d recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 msgid "Must set account information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 msgid "This recipe requires a username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:277 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:297 msgid "Last downloaded: %s days ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:299 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:326 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:136 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:329 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:336 #: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 #: /home/kovid/work/calibre/src/calibre/library/database2.py:752 #: /home/kovid/work/calibre/src/calibre/library/database2.py:756 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1055 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1063 msgid "News" msgstr "" @@ -3387,49 +3515,49 @@ msgstr "" msgid "Job has already run" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:907 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:933 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:908 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:934 msgid "Date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:107 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:303 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:309 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:701 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:702 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:839 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:865 msgid "Format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:870 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:968 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -3458,7 +3586,7 @@ msgid "No matches for the search phrase %s were found." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:157 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:378 msgid "No matches found" msgstr "" @@ -3505,128 +3633,128 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:89 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:101 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:102 msgid "&Donate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:103 msgid "&Quit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:105 msgid "&Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:149 msgid "" "

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

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:169 -msgid "Send to main memory" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/main.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:170 -msgid "Send to storage card" +msgid "Send to main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:171 +msgid "Send to storage card" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/main.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:171 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:188 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:191 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 msgid "" "Add books from directories, including sub-directories (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:192 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:193 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:342 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1243 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:213 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:231 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:232 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:234 msgid "Set defaults for conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:235 msgid "Set defaults for conversion of comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256 msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:302 msgid "Bad database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1356 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1398 msgid "Choose a location for your ebook library." msgstr "" @@ -3634,23 +3762,27 @@ msgstr "" msgid "Migrating database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:428 +msgid "Browse by covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:517 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:518 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:540 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:551 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:552 msgid "" "\n" "

The database of books on the reader is corrupted. Try the " @@ -3666,320 +3798,320 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:571 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:601 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:689 msgid "Stop" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:604 msgid "Adding books recursively..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:608 msgid "Added " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:608 msgid "Searching..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:589 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:695 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:620 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 msgid "" "

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