From 474f2cadbb385b134d3018a3f79ba8261660f9c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 09:44:49 -0700 Subject: [PATCH 01/54] Add option to render tables as images (avaialble in the Page options section). This should be helpful for HTML files with complex tables. --- osx_installer.py | 13 ++- src/calibre/ebooks/lrf/__init__.py | 6 +- src/calibre/ebooks/lrf/html/convert_from.py | 55 ++++++++--- src/calibre/ebooks/lrf/html/table_as_image.py | 99 +++++++++++++++++++ src/calibre/gui2/dialogs/fetch_metadata.ui | 7 +- src/calibre/gui2/dialogs/lrf_single.py | 1 + src/calibre/gui2/dialogs/lrf_single.ui | 99 ++++++++++++++----- src/calibre/parallel.py | 44 ++++++--- windows_installer.py | 12 ++- 9 files changed, 273 insertions(+), 63 deletions(-) create mode 100644 src/calibre/ebooks/lrf/html/table_as_image.py diff --git a/osx_installer.py b/osx_installer.py index cccb46ad93..6fb8b3a4e8 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -51,6 +51,7 @@ def _check_symlinks_prescript(): import os scripts = %(sp)s links = %(sp)s +fonts_conf = %(sp)s os.setuid(0) for s, l in zip(scripts, links): if os.path.lexists(l): @@ -59,6 +60,11 @@ for s, l in zip(scripts, links): omask = os.umask(022) os.symlink(s, l) os.umask(omask) +if not os.path.exists('/etc/fonts/fonts.conf'): + print 'Creating default fonts.conf' + if not os.path.exists('/etc/fonts'): + os.makedirs('/etc/fonts') + os.link(fonts_conf, '/etc/fonts/fonts.conf') """ dest_path = %(dest_path)s @@ -66,6 +72,7 @@ for s, l in zip(scripts, links): scripts = %(scripts)s links = [os.path.join(dest_path, i) for i in scripts] scripts = [os.path.join(resources_path, 'loaders', i) for i in scripts] + fonts_conf = os.path.join(resources_path, 'fonts.conf') bad = False for s, l in zip(scripts, links): @@ -76,7 +83,7 @@ for s, l in zip(scripts, links): if bad: auth = Authorization(destroyflags=(kAuthorizationFlagDestroyRights,)) fd, name = tempfile.mkstemp('.py') - os.write(fd, AUTHTOOL %(pp)s (sys.executable, repr(scripts), repr(links))) + os.write(fd, AUTHTOOL %(pp)s (sys.executable, repr(scripts), repr(links), repr(fonts_conf))) os.close(fd) os.chmod(name, 0700) try: @@ -276,10 +283,12 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), ' f.write('src/calibre/gui2/main.py', 'calibre/gui2/main.py') f.close() print + print 'Adding default fonts.conf' + open(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'fonts.conf'), 'wb').write(open('/etc/fonts/fonts.conf').read()) + print print 'Building disk image' BuildAPP.makedmg(os.path.join(self.dist_dir, APPNAME+'.app'), APPNAME+'-'+VERSION) - def main(): sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) sys.argv[1:2] = ['py2app'] diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py index 02882312a8..af93bca6cb 100644 --- a/src/calibre/ebooks/lrf/__init__.py +++ b/src/calibre/ebooks/lrf/__init__.py @@ -120,7 +120,6 @@ def option_parser(usage, gui_mode=False): dest='font_delta') laf.add_option('--ignore-colors', action='store_true', default=False, dest='ignore_colors', help=_('Render all content as black on white instead of the colors specified by the HTML or CSS.')) - page = parser.add_option_group('PAGE OPTIONS') profiles = profile_map.keys() @@ -139,6 +138,11 @@ def option_parser(usage, gui_mode=False): help=_('''Top margin of page. Default is %default px.''')) page.add_option('--bottom-margin', default=0, dest='bottom_margin', type='int', help=_('''Bottom margin of page. Default is %default px.''')) + page.add_option('--render-tables-as-images', default=False, action='store_true', + help=_('Render tables in the HTML as images (useful if the document has large or complex tables)')) + page.add_option('--text-size-multiplier-for-rendered-tables', type='float', default=1.0, + help=_('Multiply the size of text in rendered tables by this factor. Default is %default')) + link = parser.add_option_group('LINK PROCESSING OPTIONS') link.add_option('--link-levels', action='store', type='int', default=sys.maxint, \ dest='link_levels', diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 10a7137f34..6dc268e9eb 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -383,7 +383,8 @@ class HTMLConverter(object, LoggingInterface): self.target_prefix = path self.previous_text = '\n' self.tops[path] = self.parse_file(soup) - self.processed_files.append(path) + self.processed_files.append(path) + def parse_css(self, style): @@ -494,7 +495,9 @@ class HTMLConverter(object, LoggingInterface): top = self.current_block self.current_block.must_append = True + self.soup = soup self.process_children(soup, {}, {}) + self.soup = None if self.current_para and self.current_block: self.current_para.append_to(self.current_block) @@ -1680,18 +1683,44 @@ class HTMLConverter(object, LoggingInterface): self.previous_text = ' ' self.process_children(tag, tag_css, tag_pseudo_css) elif tagname == 'table' and not self.ignore_tables and not self.in_table: - tag_css = self.tag_css(tag)[0] # Table should not inherit CSS - try: - self.process_table(tag, tag_css) - except Exception, err: - self.log_warning(_('An error occurred while processing a table: %s. Ignoring table markup.'), str(err)) - self.log_debug('', exc_info=True) - self.log_debug(_('Bad table:\n%s'), str(tag)[:300]) - self.in_table = False - self.process_children(tag, tag_css, tag_pseudo_css) - finally: - if self.minimize_memory_usage: - tag.extract() + if self.render_tables_as_images: + print 'Rendering table...' + from calibre.ebooks.lrf.html.table_as_image import render_table + pheight = int(self.current_page.pageStyle.attrs['textheight']) + pwidth = int(self.current_page.pageStyle.attrs['textwidth']) + images = render_table(self.soup, tag, tag_css, + os.path.dirname(self.target_prefix), + pwidth, pheight, self.profile.dpi, + self.text_size_multiplier_for_rendered_tables) + for path, width, height in images: + stream = ImageStream(path, encoding='PNG') + im = Image(stream, x0=0, y0=0, x1=width, y1=height,\ + xsize=width, ysize=height) + pb = self.current_block + self.end_current_para() + self.process_alignment(tag_css) + self.current_para.append(Plot(im, xsize=width*720./self.profile.dpi, + ysize=height*720./self.profile.dpi)) + self.current_block.append(self.current_para) + self.current_page.append(self.current_block) + self.current_block = self.book.create_text_block( + textStyle=pb.textStyle, + blockStyle=pb.blockStyle) + self.current_para = Paragraph() + + else: + tag_css = self.tag_css(tag)[0] # Table should not inherit CSS + try: + self.process_table(tag, tag_css) + except Exception, err: + self.log_warning(_('An error occurred while processing a table: %s. Ignoring table markup.'), str(err)) + self.log_debug('', exc_info=True) + self.log_debug(_('Bad table:\n%s'), str(tag)[:300]) + self.in_table = False + self.process_children(tag, tag_css, tag_pseudo_css) + finally: + if self.minimize_memory_usage: + tag.extract() else: self.process_children(tag, tag_css, tag_pseudo_css) finally: diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py new file mode 100644 index 0000000000..501a049832 --- /dev/null +++ b/src/calibre/ebooks/lrf/html/table_as_image.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Render HTML tables as images. +''' +import os, tempfile, atexit, shutil +from PyQt4.Qt import QWebPage, QUrl, QApplication, QSize, \ + SIGNAL, QPainter, QImage, QObject, Qt + +__app = None + +class HTMLTableRenderer(QObject): + + def __init__(self, html, base_dir, width, height, dpi, factor): + ''' + `width, height`: page width and height in pixels + `base_dir`: The directory in which the HTML file that contains the table resides + ''' + QObject.__init__(self) + + self.app = None + self.width, self.height, self.dpi = width, height, dpi + self.base_dir = base_dir + self.page = QWebPage() + self.connect(self.page, SIGNAL('loadFinished(bool)'), self.render_html) + self.page.mainFrame().setTextSizeMultiplier(factor) + self.page.mainFrame().setHtml(html, + QUrl('file:'+os.path.abspath(self.base_dir))) + self.images = [] + self.tdir = tempfile.mkdtemp(prefix='calibre_render_table') + + def render_html(self, ok): + try: + if not ok: + return + cwidth, cheight = self.page.mainFrame().contentsSize().width(), self.page.mainFrame().contentsSize().height() + self.page.setViewportSize(QSize(cwidth, cheight)) + factor = float(self.width)/cwidth if cwidth > self.width else 1 + cutoff_height = int(self.height/factor)-3 + image = QImage(self.page.viewportSize(), QImage.Format_ARGB32) + image.setDotsPerMeterX(self.dpi*(100/2.54)) + image.setDotsPerMeterX(self.dpi*(100/2.54)) + painter = QPainter(image) + self.page.mainFrame().render(painter) + painter.end() + pos = 0 + while pos < cheight: + img = image.copy(0, pos, cwidth, cutoff_height) + pos += cutoff_height-20 + if cwidth > self.width: + img = img.scaledToWidth(self.width, Qt.SmoothTransform) + f = os.path.join(self.tdir, '%d.png'%pos) + img.save(f) + self.images.append((f, img.width(), img.height())) + finally: + QApplication.quit() + +def render_table(soup, table, css, base_dir, width, height, dpi, factor=1.0): + head = '' + for e in soup.findAll(['link', 'style']): + head += unicode(e)+'\n\n' + style = '' + for key, val in css.items(): + style += key + ':%s;'%val + html = u'''\ + + + %s + + + + %s + + + '''%(head, width-10, style, unicode(table)) + from calibre.parallel import Server + s = Server() + result, exception, traceback, log = s.run(1, 'render_table', qapp=True, report_progress=False, + args=[html, base_dir, width, height, dpi, factor]) + if exception: + print 'Failed to render table' + print traceback + print log + images, tdir = result + atexit.register(shutil.rmtree, tdir) + return images + +def do_render(html, base_dir, width, height, dpi, factor): + app = QApplication.instance() + if app is None: + app = QApplication([]) + tr = HTMLTableRenderer(html, base_dir, width, height, dpi, factor) + app.exec_() + return tr.images, tr.tdir \ No newline at end of file diff --git a/src/calibre/gui2/dialogs/fetch_metadata.ui b/src/calibre/gui2/dialogs/fetch_metadata.ui index e8b4252d8d..8e5747778f 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.ui +++ b/src/calibre/gui2/dialogs/fetch_metadata.ui @@ -9,14 +9,15 @@ 0 0 830 - 700 + 642 Fetch metadata - :/images/metadata.svg + + :/images/metadata.svg:/images/metadata.svg @@ -107,7 +108,7 @@ - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/calibre/gui2/dialogs/lrf_single.py b/src/calibre/gui2/dialogs/lrf_single.py index e5df43a673..bc5bdcf06b 100644 --- a/src/calibre/gui2/dialogs/lrf_single.py +++ b/src/calibre/gui2/dialogs/lrf_single.py @@ -382,6 +382,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.cmdline = [unicode(i) for i in cmdline] else: Settings().set('LRF conversion defaults', cmdline) + print self.cmdline QDialog.accept(self) class LRFBulkDialog(LRFSingleDialog): diff --git a/src/calibre/gui2/dialogs/lrf_single.ui b/src/calibre/gui2/dialogs/lrf_single.ui index 9fd3bee155..080970b96f 100644 --- a/src/calibre/gui2/dialogs/lrf_single.ui +++ b/src/calibre/gui2/dialogs/lrf_single.ui @@ -115,7 +115,7 @@ - 0 + 2 @@ -818,6 +818,39 @@ + + + + &Convert tables to images (good for large/complex tables) + + + + + + + &Multiplier for text size in rendered tables: + + + gui_text_size_multiplier_for_rendered_tables + + + + + + + false + + + 2 + + + 0.100000000000000 + + + 1.000000000000000 + + + @@ -1048,8 +1081,8 @@ p, li { white-space: pre-wrap; } setCurrentIndex(int) - 191 - 236 + 184 + 279 368 @@ -1064,8 +1097,8 @@ p, li { white-space: pre-wrap; } setDisabled(bool) - 428 - 89 + 650 + 122 788 @@ -1073,22 +1106,6 @@ p, li { white-space: pre-wrap; } - - gui_header - toggled(bool) - gui_headerformat - setEnabled(bool) - - - 348 - 340 - - - 823 - 372 - - - gui_disable_chapter_detection toggled(bool) @@ -1096,12 +1113,44 @@ p, li { white-space: pre-wrap; } setDisabled(bool) - 321 - 78 + 543 + 122 - 322 - 172 + 544 + 211 + + + + + gui_render_tables_as_images + toggled(bool) + gui_text_size_multiplier_for_rendered_tables + setEnabled(bool) + + + 298 + 398 + + + 660 + 435 + + + + + gui_header + toggled(bool) + gui_headerformat + setEnabled(bool) + + + 330 + 367 + + + 823 + 372 diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 3d169f4822..a9490f4922 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal ' ''' Used to run jobs in parallel in separate processes. ''' -import re, sys, tempfile, os, cPickle, traceback, atexit, binascii, time, subprocess +import sys, tempfile, os, cPickle, traceback, atexit, binascii, time, subprocess from functools import partial @@ -11,6 +11,7 @@ from calibre.ebooks.lrf.any.convert_from import main as any2lrf from calibre.ebooks.lrf.web.convert_from import main as web2lrf from calibre.ebooks.lrf.feeds.convert_from import main as feeds2lrf from calibre.gui2.lrf_renderer.main import main as lrfviewer +from calibre.ebooks.lrf.html.table_as_image import do_render as render_table from calibre import iswindows, __appname__, islinux try: from calibre.utils.single_qt_application import SingleApplication @@ -31,6 +32,7 @@ PARALLEL_FUNCS = { 'web2lrf' : web2lrf, 'lrfviewer' : lrfviewer, 'feeds2lrf' : partial(feeds2lrf, notification=report_progress), + 'render_table': render_table, } python = sys.executable @@ -88,7 +90,8 @@ class Server(object): - def run(self, job_id, func, args=[], kwdargs={}, monitor=True): + def run(self, job_id, func, args=[], kwdargs={}, monitor=True, + report_progress=True, qapp=True): ''' Run a job in a separate process. @param job_id: A unique (per server) identifier @@ -96,6 +99,8 @@ class Server(object): @param args: A list of arguments to pass of C{func} @param kwdargs: A dictionary of keyword arguments to pass to C{func} @param monitor: If False launch the child process and return. Do not monitor/communicate with it. + @param report_progess: If True progress is reported to the GUI + @param qapp: If True, A QApplication is created. If False, progress reporting will also be disabled. @return: (result, exception, formatted_traceback, log) where log is the combined stdout + stderr of the child process; or None if monitor is True. If a job is killed by a call to L{kill()} then result will be L{KILL_RESULT} @@ -107,14 +112,15 @@ class Server(object): os.mkdir(job_dir) job_data = os.path.join(job_dir, 'job_data.pickle') - cPickle.dump((job_id, func, args, kwdargs), open(job_data, 'wb'), -1) + cPickle.dump((job_id, func, args, kwdargs, report_progress, qapp), + open(job_data, 'wb'), -1) prefix = '' if hasattr(sys, 'frameworks_dir'): fd = getattr(sys, 'frameworks_dir') prefix = 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd if fd not in os.environ['PATH']: os.environ['PATH'] += ':'+fd - cmd = prefix + 'from calibre.parallel import run_job; run_job(\'%s\')'%binascii.hexlify(job_data) + cmd = prefix + 'from calibre.parallel import main; main(\'%s\')'%binascii.hexlify(job_data) if not monitor: popen([python, '-c', cmd], stdout=subprocess.PIPE, stdin=subprocess.PIPE, @@ -145,14 +151,12 @@ class Server(object): return result, exception, traceback, log -def run_job(job_data): - global sa, job_id - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - job_data = binascii.unhexlify(job_data) - base = os.path.dirname(job_data) +def run_job(base, id, func, args, kwdargs): + global job_id + job_id = id + job_result = os.path.join(base, 'job_result.pickle') - job_id, func, args, kwdargs = cPickle.load(open(job_data, 'rb')) + func = PARALLEL_FUNCS[func] exception, tb = None, None try: @@ -165,14 +169,22 @@ def run_job(job_data): if os.path.exists(os.path.dirname(job_result)): cPickle.dump((result, exception, tb), open(job_result, 'wb')) -def main(): - src = sys.argv[2] - job_data = re.search(r'run_job\(\'([a-f0-9A-F]+)\'\)', src).group(1) - run_job(job_data) +def main(src): + from PyQt4.QtGui import QApplication + job_data = binascii.unhexlify(src) + global sa + job_id, func, args, kwdargs, rp, qapp = cPickle.load(open(job_data, 'rb')) + + if qapp and QApplication.instance() is None: + QApplication([]) + if SingleApplication is not None and rp and QApplication.instance() is not None: + sa = SingleApplication('calibre GUI') + + run_job(os.path.dirname(job_data), job_id, func, args, kwdargs) return 0 if __name__ == '__main__': - sys.exit(main()) + sys.exit(main(sys.argv[2])) diff --git a/windows_installer.py b/windows_installer.py index c38ee3487b..06fa64d8ce 100644 --- a/windows_installer.py +++ b/windows_installer.py @@ -514,6 +514,12 @@ class BuildEXE(build_exe): f.write('src\\calibre\\gui2\\main.py', 'calibre\\gui2\\main.py') f.close() + print + print 'Doing DLL redirection' # See http://msdn.microsoft.com/en-us/library/ms682600(VS.85).aspx + for f in glob.glob(os.path.join('build', 'py2exe', '*.exe')): + open(f + '.local', 'wb').write('\n') + + print print print 'Building Installer' @@ -558,12 +564,12 @@ def main(): 'win32file', 'pythoncom', 'rtf2xml', 'lxml', 'lxml._elementpath', 'genshi', 'path', 'pydoc', 'IPython.Extensions.*', - 'calibre.web.feeds.recipes.*', 'pydoc', + 'calibre.web.feeds.recipes.*', ], 'packages' : ['PIL'], 'excludes' : ["Tkconstants", "Tkinter", "tcl", - "_imagingtk", "ImageTk", "FixTk", - 'pydoc'], + "_imagingtk", "ImageTk", "FixTk" + ], 'dll_excludes' : ['mswsock.dll'], }, }, From 2265152c777e78de862e2b1dd16ec155b25183cb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 10:09:33 -0700 Subject: [PATCH 02/54] Fix #795 --- src/calibre/ebooks/lrf/any/convert_from.py | 5 ++++- src/calibre/ebooks/lrf/html/convert_from.py | 7 +++++-- src/calibre/parallel.py | 5 ++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/lrf/any/convert_from.py b/src/calibre/ebooks/lrf/any/convert_from.py index 4142c71c55..ab66fc1b89 100644 --- a/src/calibre/ebooks/lrf/any/convert_from.py +++ b/src/calibre/ebooks/lrf/any/convert_from.py @@ -158,7 +158,10 @@ def main(args=sys.argv, logger=None, gui_mode=False): print _('No file to convert specified.') return 1 - return process_file(args[1], options, logger) + src = args[1] + if not isinstance(src, unicode): + src = src.decode(sys.getfilesystemencoding()) + return process_file(src, options, logger) if __name__ == '__main__': sys.exit(main()) diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 6dc268e9eb..aca8cf96b3 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -30,7 +30,7 @@ from calibre.ebooks.lrf import option_parser as lrf_option_parser from calibre.ebooks import ConversionError from calibre.ebooks.lrf.html.table import Table from calibre import filename_to_utf8, setup_cli_handlers, __appname__, \ - fit_image, LoggingInterface + fit_image, LoggingInterface, preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.opf import OPFReader from calibre.devices.interface import Device @@ -1853,6 +1853,8 @@ def process_file(path, options, logger=None): options.force_page_break = fpb options.link_exclude = le options.page_break = pb + if not isinstance(options.chapter_regex, unicode): + options.chapter_regex = options.chapter_regex.decode(preferred_encoding) options.chapter_regex = re.compile(options.chapter_regex, re.IGNORECASE) fpba = options.force_page_break_attr.split(',') if len(fpba) != 3: @@ -1969,7 +1971,8 @@ def main(args=sys.argv): except Exception, err: print >> sys.stderr, err return 1 - + if not isinstance(src, unicode): + src = src.decode(sys.getfilesystemencoding()) process_file(src, options) return 0 diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index a9490f4922..307c894cfe 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -11,7 +11,10 @@ from calibre.ebooks.lrf.any.convert_from import main as any2lrf from calibre.ebooks.lrf.web.convert_from import main as web2lrf from calibre.ebooks.lrf.feeds.convert_from import main as feeds2lrf from calibre.gui2.lrf_renderer.main import main as lrfviewer -from calibre.ebooks.lrf.html.table_as_image import do_render as render_table +try: + from calibre.ebooks.lrf.html.table_as_image import do_render as render_table +except: # Dont fail is PyQt4.4 not present + render_table = None from calibre import iswindows, __appname__, islinux try: from calibre.utils.single_qt_application import SingleApplication From b5b6f10c4861330652f546beb78f30173257cdf0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 10:42:19 -0700 Subject: [PATCH 03/54] Add option to detect chapters based on tagname and attributes --- src/calibre/ebooks/lrf/__init__.py | 7 ++++--- src/calibre/ebooks/lrf/html/convert_from.py | 15 +++++++++++++++ src/calibre/gui2/dialogs/lrf_single.py | 13 +++++++------ src/calibre/gui2/dialogs/lrf_single.ui | 15 ++++++++++++++- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py index af93bca6cb..1cdba123d8 100644 --- a/src/calibre/ebooks/lrf/__init__.py +++ b/src/calibre/ebooks/lrf/__init__.py @@ -158,12 +158,13 @@ def option_parser(usage, gui_mode=False): chapter = parser.add_option_group('CHAPTER OPTIONS') chapter.add_option('--disable-chapter-detection', action='store_true', default=False, dest='disable_chapter_detection', - help=_('''Prevent the automatic insertion of page breaks''' - ''' before detected chapters.''')) + help=_('''Prevent the automatic detection chapters.''')) chapter.add_option('--chapter-regex', dest='chapter_regex', default='chapter|book|appendix', help=_('''The regular expression used to detect chapter titles.''' - ''' It is searched for in heading tags (h1-h6). Defaults to %default''')) + ''' It is searched for in heading tags (h1-h6). Defaults to %default''')) + chapter.add_option('--chapter-attr', default='$,,$', + help=_('Detect a chapter beginning at an element having the specified attribute. The format for this option is tagname regexp,attribute name,attribute value regexp. For example to match all heading tags that have the attribute class="chapter" you would use "h\d,class,chapter". Default is %default''')) chapter.add_option('--page-break-before-tag', dest='page_break', default='h[12]', help=_('''If html2lrf does not find any page breaks in the ''' '''html file and cannot detect chapter headings, it will ''' diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index aca8cf96b3..218ace2bf7 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -1427,6 +1427,18 @@ class HTMLConverter(object, LoggingInterface): return except KeyError: pass + if not self.disable_chapter_detection and \ + (self.chapter_attr[0].match(tagname) and \ + tag.has_key(self.chapter_attr[1]) and \ + self.chapter_attr[2].match(tag[self.chapter_attr[1]])): + self.log_debug('Detected chapter %s', tagname) + self.end_page() + self.page_break_found = True + + if self.options.add_chapters_to_toc: + self.extra_toc_entries.append((self.get_text(tag, + limit=1000), self.current_block)) + end_page = self.process_page_breaks(tag, tagname, tag_css) try: if tagname in ["title", "script", "meta", 'del', 'frameset']: @@ -1850,6 +1862,9 @@ def process_file(path, options, logger=None): re.compile('$') fpb = re.compile(options.force_page_break, re.IGNORECASE) if options.force_page_break else \ re.compile('$') + cq = options.chapter_attr.split(',') + options.chapter_attr = [re.compile(cq[0], re.IGNORECASE), cq[1], + re.compile(cq[2], re.IGNORECASE)] options.force_page_break = fpb options.link_exclude = le options.page_break = pb diff --git a/src/calibre/gui2/dialogs/lrf_single.py b/src/calibre/gui2/dialogs/lrf_single.py index bc5bdcf06b..c8895a4243 100644 --- a/src/calibre/gui2/dialogs/lrf_single.py +++ b/src/calibre/gui2/dialogs/lrf_single.py @@ -1,8 +1,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, cPickle, codecs +import os, codecs -from PyQt4.QtCore import QObject, SIGNAL, Qt, QVariant, QByteArray +from PyQt4.QtCore import QObject, SIGNAL, Qt from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, \ QPixmap, QTextEdit, QListWidgetItem, QIcon @@ -65,7 +65,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): QObject.connect(self.categoryList, SIGNAL('itemEntered(QListWidgetItem *)'), self.show_category_help) QObject.connect(self.cover_button, SIGNAL("clicked(bool)"), self.select_cover) - self.categoryList.leaveEvent = self.reset_help + #self.categoryList.leaveEvent = self.reset_help self.reset_help() self.selected_format = None self.initialize_common() @@ -277,9 +277,9 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): obj.setWhatsThis(help) self.option_map[guiname] = opt obj.__class__.enterEvent = show_item_help - obj.leaveEvent = self.reset_help + #obj.leaveEvent = self.reset_help self.preprocess.__class__.enterEvent = show_item_help - self.preprocess.leaveEvent = self.reset_help + #self.preprocess.leaveEvent = self.reset_help def show_category_help(self, item): @@ -293,7 +293,8 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.set_help(help[text]) def set_help(self, msg): - self.help_view.setHtml('%s'%(msg,)) + if msg and getattr(msg, 'strip', lambda:True)(): + self.help_view.setHtml('%s'%(msg,)) def reset_help(self, *args): self.set_help(_('No help available')) diff --git a/src/calibre/gui2/dialogs/lrf_single.ui b/src/calibre/gui2/dialogs/lrf_single.ui index 080970b96f..d0d304ac6e 100644 --- a/src/calibre/gui2/dialogs/lrf_single.ui +++ b/src/calibre/gui2/dialogs/lrf_single.ui @@ -115,7 +115,7 @@ - 2 + 0 @@ -951,6 +951,19 @@ + + + + Detect chapter &at tag: + + + gui_chapter_attr + + + + + + From 37cc4b13ea4a5644b0df663a6162b3ee8af4346d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 12:52:58 -0700 Subject: [PATCH 04/54] Fix #797 --- src/calibre/gui2/dialogs/lrf_single.py | 24 +++++++++++++++++------- src/calibre/gui2/dialogs/lrf_single.ui | 18 +++++++++++++++++- src/calibre/gui2/main.py | 9 +++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/dialogs/lrf_single.py b/src/calibre/gui2/dialogs/lrf_single.py index c8895a4243..e8f3d61b7c 100644 --- a/src/calibre/gui2/dialogs/lrf_single.py +++ b/src/calibre/gui2/dialogs/lrf_single.py @@ -48,10 +48,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.gui_mono_family.setModel(self.font_family_model) self.load_saved_global_defaults() - def __init__(self, window, db, row): - QDialog.__init__(self, window) - Ui_LRFSingleDialog.__init__(self) - self.setupUi(self) + def populate_list(self): self.__w = [] self.__w.append(QIcon(':/images/dialog_information.svg')) self.item1 = QListWidgetItem(self.__w[-1], _("Metadata"), self.categoryList) @@ -61,6 +58,12 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.item3 = QListWidgetItem(self.__w[-1], _('Page Setup'), self.categoryList) self.__w.append(QIcon(':/images/chapters.svg')) self.item4 = QListWidgetItem(self.__w[-1], _('Chapter Detection'), self.categoryList) + + def __init__(self, window, db, row): + QDialog.__init__(self, window) + Ui_LRFSingleDialog.__init__(self) + self.setupUi(self) + self.populate_list() self.categoryList.setCurrentRow(0) QObject.connect(self.categoryList, SIGNAL('itemEntered(QListWidgetItem *)'), self.show_category_help) @@ -383,15 +386,15 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.cmdline = [unicode(i) for i in cmdline] else: Settings().set('LRF conversion defaults', cmdline) - print self.cmdline QDialog.accept(self) class LRFBulkDialog(LRFSingleDialog): def __init__(self, window): QDialog.__init__(self, window) - Ui_LRFSingleDialog.__init__(self) + Ui_LRFSingleDialog.__init__(self) self.setupUi(self) + self.populate_list() self.categoryList.takeItem(0) self.stack.removeWidget(self.stack.widget(0)) @@ -401,7 +404,14 @@ class LRFBulkDialog(LRFSingleDialog): self.setWindowTitle(_('Bulk convert ebooks to LRF')) def accept(self): - self.cmdline = self.cmdline = [unicode(i) for i in self.build_commandline()] + self.cmdline = [unicode(i) for i in self.build_commandline()] + for meta in ('--title', '--author', '--publisher', '--comment'): + try: + index = self.cmdline.index(meta) + self.cmdline[index:index+2] = [] + except ValueError: + continue + self.cover_file = None QDialog.accept(self) diff --git a/src/calibre/gui2/dialogs/lrf_single.ui b/src/calibre/gui2/dialogs/lrf_single.ui index d0d304ac6e..c63e4915b7 100644 --- a/src/calibre/gui2/dialogs/lrf_single.ui +++ b/src/calibre/gui2/dialogs/lrf_single.ui @@ -115,7 +115,7 @@ - 0 + 3 @@ -1167,5 +1167,21 @@ p, li { white-space: pre-wrap; } + + gui_disable_chapter_detection + toggled(bool) + gui_chapter_attr + setDisabled(bool) + + + 344 + 107 + + + 489 + 465 + + + diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 06c4eaff19..6d63e0ad67 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -746,6 +746,15 @@ class Main(MainWindow, Ui_MainWindow): for i, row in enumerate([r.row() for r in rows]): cmdline = list(d.cmdline) + mi = self.library_view.model().db.get_metadata(row) + if mi.title: + cmdline.extend(['--title', mi.title]) + if mi.authors: + cmdline.extend(['--author', ','.join(mi.authors)]) + if mi.publisher: + cmdline.extend(['--publisher', mi.publisher]) + if mi.comments: + cmdline.extend(['--comment', mi.comments]) data = None for fmt in LRF_PREFERRED_SOURCE_FORMATS: try: From 69695a599c41fc61e3b0954d7948f2f3514ba3ab Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 13:12:09 -0700 Subject: [PATCH 05/54] IGN:... --- src/calibre/parallel.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 307c894cfe..405aa36b0a 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -101,7 +101,9 @@ class Server(object): @param func: One of C{PARALLEL_FUNCS.keys()} @param args: A list of arguments to pass of C{func} @param kwdargs: A dictionary of keyword arguments to pass to C{func} - @param monitor: If False launch the child process and return. Do not monitor/communicate with it. + @param monitor: If False launch the child process and return. + Do not monitor/communicate with it. Automatically sets + `report_progress` and `qapp` to False. @param report_progess: If True progress is reported to the GUI @param qapp: If True, A QApplication is created. If False, progress reporting will also be disabled. @return: (result, exception, formatted_traceback, log) where log is the combined @@ -115,6 +117,8 @@ class Server(object): os.mkdir(job_dir) job_data = os.path.join(job_dir, 'job_data.pickle') + if not monitor: + report_progress = qapp = False cPickle.dump((job_id, func, args, kwdargs, report_progress, qapp), open(job_data, 'wb'), -1) prefix = '' @@ -126,8 +130,7 @@ class Server(object): cmd = prefix + 'from calibre.parallel import main; main(\'%s\')'%binascii.hexlify(job_data) if not monitor: - popen([python, '-c', cmd], stdout=subprocess.PIPE, stdin=subprocess.PIPE, - stderr=subprocess.PIPE) + popen([python, '-c', cmd]) return output = open(os.path.join(job_dir, 'output.txt'), 'wb') @@ -157,7 +160,6 @@ class Server(object): def run_job(base, id, func, args, kwdargs): global job_id job_id = id - job_result = os.path.join(base, 'job_result.pickle') func = PARALLEL_FUNCS[func] From 36c525c0d26737c37b62ca30e0f92dd9e2c424f5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 22:24:38 -0700 Subject: [PATCH 06/54] IGN:Another unicode fix --- src/calibre/ebooks/lrf/html/convert_from.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 218ace2bf7..5b5628424c 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -1784,6 +1784,8 @@ def process_file(path, options, logger=None): level = logging.DEBUG if options.verbose else logging.INFO logger = logging.getLogger('html2lrf') setup_cli_handlers(logger, level) + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) path = os.path.abspath(path) default_title = filename_to_utf8(os.path.splitext(os.path.basename(path))[0]) dirpath = os.path.dirname(path) From 8fcf04a9be76b5e138992a834930d355e737c63e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jun 2008 22:29:53 -0700 Subject: [PATCH 07/54] IGN:... --- src/calibre/ebooks/lrf/html/convert_from.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 5b5628424c..457837aa30 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -260,6 +260,7 @@ class HTMLConverter(object, LoggingInterface): paths = [os.path.abspath(path) for path in paths] + paths = [path.decode(sys.getfilesystemencoding()) if not isinstance(path, unicode) else path for path in paths] while len(paths) > 0 and self.link_level <= self.link_levels: for path in paths: @@ -380,6 +381,8 @@ class HTMLConverter(object, LoggingInterface): self.log_info(_('\tConverting to BBeB...')) self.current_style = {} self.page_break_found = False + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) self.target_prefix = path self.previous_text = '\n' self.tops[path] = self.parse_file(soup) @@ -628,6 +631,8 @@ class HTMLConverter(object, LoggingInterface): para, text, path, fragment = link['para'], link['text'], link['path'], link['fragment'] ascii_text = text + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) if path in self.processed_files: if path+fragment in self.targets.keys(): tb = get_target_block(path+fragment, self.targets) From 9f1daa37d646dcc6addf99e742b9beb69bd2bcea Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 19 Jun 2008 23:23:34 -0700 Subject: [PATCH 08/54] IGN:Initial implementation of process pool. Tested on linux --- osx_installer.py | 2 + src/calibre/__init__.py | 3 + src/calibre/ebooks/lrf/html/convert_from.py | 71 +-- src/calibre/ebooks/lrf/html/table_as_image.py | 17 +- src/calibre/gui2/dialogs/jobs.py | 2 +- src/calibre/gui2/jobs.py | 58 +- src/calibre/gui2/main.py | 32 +- src/calibre/gui2/status.py | 2 +- src/calibre/parallel.py | 527 +++++++++++++----- src/calibre/terminfo.py | 2 +- src/calibre/utils/single_qt_application.py | 15 +- 11 files changed, 527 insertions(+), 204 deletions(-) diff --git a/osx_installer.py b/osx_installer.py index 6fb8b3a4e8..c42fe5f0a1 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -80,6 +80,8 @@ if not os.path.exists('/etc/fonts/fonts.conf'): continue bad = True break + if not bad: + bad = os.path.exists('/etc/fonts/fonts.conf') if bad: auth = Authorization(destroyflags=(kAuthorizationFlagDestroyRights,)) fd, name = tempfile.mkstemp('.py') diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 12eeb2f625..d70637d84f 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -88,6 +88,9 @@ def setup_cli_handlers(logger, level): handler = logging.StreamHandler(sys.stderr) handler.setLevel(logging.DEBUG) handler.setFormatter(logging.Formatter('[%(levelname)s] %(filename)s:%(lineno)s: %(message)s')) + for hdlr in logger.handlers: + if hdlr.__class__ == handler.__class__: + logger.removeHandler(hdlr) logger.addHandler(handler) class CustomHelpFormatter(IndentedHelpFormatter): diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 457837aa30..4d93b1a56b 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -242,6 +242,7 @@ class HTMLConverter(object, LoggingInterface): self.override_css = {} self.override_pcss = {} + self.table_render_job_server = None if self._override_css is not None: if os.access(self._override_css, os.R_OK): @@ -262,37 +263,41 @@ class HTMLConverter(object, LoggingInterface): paths = [os.path.abspath(path) for path in paths] paths = [path.decode(sys.getfilesystemencoding()) if not isinstance(path, unicode) else path for path in paths] - while len(paths) > 0 and self.link_level <= self.link_levels: - for path in paths: - if path in self.processed_files: - continue - try: - self.add_file(path) - except KeyboardInterrupt: - raise - except: - if self.link_level == 0: # Die on errors in the first level + try: + while len(paths) > 0 and self.link_level <= self.link_levels: + for path in paths: + if path in self.processed_files: + continue + try: + self.add_file(path) + except KeyboardInterrupt: raise - for link in self.links: - if link['path'] == path: - self.links.remove(link) - break - self.log_warn('Could not process '+path) - if self.verbose: - self.log_exception(' ') - self.links = self.process_links() - self.link_level += 1 - paths = [link['path'] for link in self.links] - - if self.current_page is not None and self.current_page.has_text(): - self.book.append(self.current_page) - - for text, tb in self.extra_toc_entries: - self.book.addTocEntry(text, tb) - - if self.base_font_size > 0: - self.log_info('\tRationalizing font sizes...') - self.book.rationalize_font_sizes(self.base_font_size) + except: + if self.link_level == 0: # Die on errors in the first level + raise + for link in self.links: + if link['path'] == path: + self.links.remove(link) + break + self.log_warn('Could not process '+path) + if self.verbose: + self.log_exception(' ') + self.links = self.process_links() + self.link_level += 1 + paths = [link['path'] for link in self.links] + + if self.current_page is not None and self.current_page.has_text(): + self.book.append(self.current_page) + + for text, tb in self.extra_toc_entries: + self.book.addTocEntry(text, tb) + + if self.base_font_size > 0: + self.log_info('\tRationalizing font sizes...') + self.book.rationalize_font_sizes(self.base_font_size) + finally: + if self.table_render_job_server is not None: + self.table_render_job_server.killall() def is_baen(self, soup): return bool(soup.find('meta', attrs={'name':'Publisher', @@ -1701,11 +1706,15 @@ class HTMLConverter(object, LoggingInterface): self.process_children(tag, tag_css, tag_pseudo_css) elif tagname == 'table' and not self.ignore_tables and not self.in_table: if self.render_tables_as_images: + if self.table_render_job_server is None: + from calibre.parallel import Server + self.table_render_job_server = Server(number_of_workers=1) print 'Rendering table...' from calibre.ebooks.lrf.html.table_as_image import render_table pheight = int(self.current_page.pageStyle.attrs['textheight']) pwidth = int(self.current_page.pageStyle.attrs['textwidth']) - images = render_table(self.soup, tag, tag_css, + images = render_table(self.table_render_job_server, + self.soup, tag, tag_css, os.path.dirname(self.target_prefix), pwidth, pheight, self.profile.dpi, self.text_size_multiplier_for_rendered_tables) diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py index 501a049832..4c5a79eab8 100644 --- a/src/calibre/ebooks/lrf/html/table_as_image.py +++ b/src/calibre/ebooks/lrf/html/table_as_image.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' ''' Render HTML tables as images. ''' -import os, tempfile, atexit, shutil +import os, tempfile, atexit, shutil, time from PyQt4.Qt import QWebPage, QUrl, QApplication, QSize, \ SIGNAL, QPainter, QImage, QObject, Qt @@ -58,7 +58,7 @@ class HTMLTableRenderer(QObject): finally: QApplication.quit() -def render_table(soup, table, css, base_dir, width, height, dpi, factor=1.0): +def render_table(server, soup, table, css, base_dir, width, height, dpi, factor=1.0): head = '' for e in soup.findAll(['link', 'style']): head += unicode(e)+'\n\n' @@ -78,14 +78,17 @@ def render_table(soup, table, css, base_dir, width, height, dpi, factor=1.0): '''%(head, width-10, style, unicode(table)) - from calibre.parallel import Server - s = Server() - result, exception, traceback, log = s.run(1, 'render_table', qapp=True, report_progress=False, - args=[html, base_dir, width, height, dpi, factor]) + server.run_job(1, 'render_table', + args=[html, base_dir, width, height, dpi, factor]) + res = None + while res is None: + time.sleep(2) + res = server.result(1) + result, exception, traceback = res if exception: print 'Failed to render table' + print exception print traceback - print log images, tdir = result atexit.register(shutil.rmtree, tdir) return images diff --git a/src/calibre/gui2/dialogs/jobs.py b/src/calibre/gui2/dialogs/jobs.py index b601cf2c7c..e0682b6bd8 100644 --- a/src/calibre/gui2/dialogs/jobs.py +++ b/src/calibre/gui2/dialogs/jobs.py @@ -35,7 +35,7 @@ class JobsDialog(QDialog, Ui_JobsDialog): self.jobs_view.setModel(model) self.model = model self.setWindowModality(Qt.NonModal) - self.setWindowTitle(__appname__ + ' - Active Jobs') + self.setWindowTitle(__appname__ + _(' - Jobs')) QObject.connect(self.jobs_view.model(), SIGNAL('modelReset()'), self.jobs_view.resizeColumnsToContents) QObject.connect(self.kill_button, SIGNAL('clicked()'), diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index d135b7d6cd..794a9d8f17 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -86,17 +86,34 @@ class DeviceJob(Job): class ConversionJob(Job): ''' Jobs that involve conversion of content.''' - def run(self): - last_traceback, exception = None, None - try: - self.result, exception, last_traceback, self.log = \ - self.server.run(self.id, self.func, self.args, self.kwargs) - except Exception, err: - last_traceback = traceback.format_exc() - exception = (exception.__class__.__name__, unicode(str(err), 'utf8', 'replace')) - - self.last_traceback, self.exception = last_traceback, exception + def __init__(self, *args, **kwdargs): + Job.__init__(self, *args, **kwdargs) + self.log = '' + def run(self): + result = None + self.server.run_job(self.id, self.func, progress=self.progress, + args=self.args, kwdargs=self.kwargs, + output=self.output) + res = None + while res is None: + time.sleep(2) + res = self.server.result(self.id) + if res is None: + exception, tb = 'UnknownError: This should not have happened', '' + else: + result, exception, tb = res + self.result, self.last_traceback, self.exception = result, tb, exception + + def output(self, msg): + if self.log is None: + self.log = '' + self.log += msg + self.emit(SIGNAL('output_received()')) + + def formatted_log(self): + return '

Log:

%s
'%self.log + def notify(self): self.emit(SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), self.id, self.description, self.result, self.exception, self.last_traceback, self.log) @@ -112,6 +129,9 @@ class ConversionJob(Job): ans = u'

%s: %s

'%self.exception ans += '

Traceback:

%s
'%self.last_traceback return ans + + def progress(self, percent, msg): + self.emit(SIGNAL('update_progress(int, PyQt_PyObject)'), self.id, percent) class JobManager(QAbstractTableModel): @@ -149,9 +169,9 @@ class JobManager(QAbstractTableModel): try: if isinstance(job, DeviceJob): job.terminate() - self.process_server.kill(job.id) except: continue + self.process_server.killall() def timerEvent(self, event): if event.timerId() == self.timer_id: @@ -241,7 +261,10 @@ class JobManager(QAbstractTableModel): id = self.next_id job = job_class(id, description, slot, priority, *args, **kwargs) job.server = self.process_server - QObject.connect(job, SIGNAL('status_update(int, int)'), self.status_update, Qt.QueuedConnection) + QObject.connect(job, SIGNAL('status_update(int, int)'), self.status_update, + Qt.QueuedConnection) + self.connect(job, SIGNAL('update_progress(int, PyQt_PyObject)'), + self.update_progress, Qt.QueuedConnection) self.update_lock.lock() self.add_queue.append(job) self.update_lock.unlock() @@ -370,11 +393,14 @@ class DetailView(QDialog, Ui_Dialog): self.setupUi(self) self.setWindowTitle(job.description) self.job = job - txt = self.job.formatted_error() + self.job.formatted_log() + self.connect(self.job, SIGNAL('output_received()'), self.update) + self.update() + + def update(self): + txt = self.job.formatted_error() + self.job.formatted_log() if not txt: txt = 'No details available' - self.log.setHtml(txt) - - + vbar = self.log.verticalScrollBar() + vbar.setValue(vbar.maximum()) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 6d63e0ad67..a567bc567d 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -77,7 +77,6 @@ class Main(MainWindow, Ui_MainWindow): self.conversion_jobs = {} self.persistent_files = [] self.metadata_dialogs = [] - self.viewer_job_id = 1 self.default_thumbnail = None self.device_error_dialog = ConversionErrorDialog(self, _('Error communicating with device'), ' ') self.device_error_dialog.setModal(Qt.NonModal) @@ -264,14 +263,6 @@ class Main(MainWindow, Ui_MainWindow): elif msg.startswith('refreshdb:'): self.library_view.model().resort() self.library_view.model().research() - elif msg.startswith('progress:'): - try: - fields = msg.split(':') - job_id, percent = fields[1:3] - job_id, percent = int(job_id), float(percent) - self.job_manager.update_progress(job_id, percent) - except: - pass else: print msg @@ -780,7 +771,7 @@ class Main(MainWindow, Ui_MainWindow): cmdline.append(pt.name) id = self.job_manager.run_conversion_job(self.book_converted, 'any2lrf', args=[cmdline], - job_description='Convert book %d of %d'%(i, len(rows))) + job_description='Convert book %d of %d'%(i+1, len(rows))) self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format, @@ -860,15 +851,16 @@ class Main(MainWindow, Ui_MainWindow): self._view_file(result) def _view_file(self, name): - if name.upper().endswith('.LRF'): - args = ['lrfviewer', name] - self.job_manager.process_server.run('viewer%d'%self.viewer_job_id, - 'lrfviewer', kwdargs=dict(args=args), - monitor=False) - self.viewer_job_id += 1 - else: - QDesktopServices.openUrl(QUrl('file:'+name))#launch(name) - time.sleep(2) # User feedback + self.setCursor(Qt.BusyCursor) + try: + if name.upper().endswith('.LRF'): + args = ['lrfviewer', name] + self.job_manager.process_server.run_free_job('lrfviewer', kwdargs=dict(args=args)) + else: + QDesktopServices.openUrl(QUrl('file:'+name))#launch(name) + time.sleep(5) # User feedback + finally: + self.unsetCursor() def view_specific_format(self, triggered): rows = self.library_view.selectionModel().selectedRows() @@ -1084,7 +1076,7 @@ class Main(MainWindow, Ui_MainWindow): if getattr(exception, 'only_msg', False): error_dialog(self, _('Conversion Error'), unicode(exception)).exec_() return - msg = u'

%s: %s

'%exception + msg = u'

%s:

'%exception msg += u'

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

Detailed traceback:

'
         msg += formatted_traceback + '
' diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py index 55e5c3f901..8b059f5711 100644 --- a/src/calibre/gui2/status.py +++ b/src/calibre/gui2/status.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import textwrap, re +import re from PyQt4.QtGui import QStatusBar, QMovie, QLabel, QFrame, QHBoxLayout, QPixmap, \ QVBoxLayout, QSizePolicy, QToolButton, QIcon diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 405aa36b0a..1c9593b94f 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -1,25 +1,25 @@ +from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' ''' Used to run jobs in parallel in separate processes. ''' -import sys, tempfile, os, cPickle, traceback, atexit, binascii, time, subprocess +import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, subprocess, socket, collections +from select import select from functools import partial - +from threading import RLock, Thread, Event from calibre.ebooks.lrf.any.convert_from import main as any2lrf from calibre.ebooks.lrf.web.convert_from import main as web2lrf from calibre.ebooks.lrf.feeds.convert_from import main as feeds2lrf from calibre.gui2.lrf_renderer.main import main as lrfviewer +from calibre.ptempfile import PersistentTemporaryFile + try: from calibre.ebooks.lrf.html.table_as_image import do_render as render_table except: # Dont fail is PyQt4.4 not present render_table = None -from calibre import iswindows, __appname__, islinux -try: - from calibre.utils.single_qt_application import SingleApplication -except: - SingleApplication = None +from calibre import iswindows, islinux, detect_ncpus sa = None job_id = None @@ -29,12 +29,13 @@ def report_progress(percent, msg=''): msg = 'progress:%s:%f:%s'%(job_id, percent, msg) sa.send_message(msg) +_notify = 'fskjhwseiuyweoiu987435935-0342' PARALLEL_FUNCS = { 'any2lrf' : partial(any2lrf, gui_mode=True), 'web2lrf' : web2lrf, 'lrfviewer' : lrfviewer, - 'feeds2lrf' : partial(feeds2lrf, notification=report_progress), + 'feeds2lrf' : partial(feeds2lrf, notification=_notify), 'render_table': render_table, } @@ -52,144 +53,422 @@ if islinux and hasattr(sys, 'frozen_path'): python = os.path.join(getattr(sys, 'frozen_path'), 'parallel') popen = partial(subprocess.Popen, cwd=getattr(sys, 'frozen_path')) -def cleanup(tdir): - try: - import shutil - shutil.rmtree(tdir, True) - except: - pass +prefix = 'import sys; sys.in_worker = True; ' +if hasattr(sys, 'frameworks_dir'): + fd = getattr(sys, 'frameworks_dir') + prefix += 'sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd + if fd not in os.environ['PATH']: + os.environ['PATH'] += ':'+fd -class Server(object): + +def write(socket, msg, timeout=5): + if isinstance(msg, unicode): + msg = msg.encode('utf-8') + length = None + while len(msg) > 0: + if length is None: + length = len(msg) + chunk = ('%-12d'%length) + msg[:4096-12] + msg = msg[4096-12:] + else: + chunk, msg = msg[:4096], msg[4096:] + w = select([], [socket], [], timeout)[1] + if not w: + raise RuntimeError('Write to socket timed out') + if socket.sendall(chunk) is not None: + raise RuntimeError('Failed to write chunk to socket') + + +def read(socket, timeout=5): + buf = cStringIO.StringIO() + length = None + while select([socket],[],[],timeout)[0]: + msg = socket.recv(4096) + if not msg: + break + if length is None: + length, msg = int(msg[:12]), msg[12:] + buf.write(msg) + if buf.tell() >= length: + break + if not length: + return '' + msg = buf.getvalue()[:length] + if len(msg) < length: + raise RuntimeError('Corrupted packet received') + + return msg + +class RepeatingTimer(Thread): + + def repeat(self): + while True: + self.event.wait(self.interval) + if self.event.isSet(): + break + self.action() + + def __init__(self, interval, func): + self.event = Event() + self.interval = interval + self.action = func + Thread.__init__(self, target=self.repeat) + self.setDaemon(True) + +class ControlError(Exception): + pass + +class Overseer(object): - #: Interval in seconds at which child processes are polled for status information - INTERVAL = 0.1 KILL_RESULT = 'Server: job killed by user|||#@#$%&*)*(*$#$%#$@&' + INTERVAL = 0.1 - def __init__(self): - self.tdir = tempfile.mkdtemp('', '%s_IPC_'%__appname__) - atexit.register(cleanup, self.tdir) - self.kill_jobs = [] + def __init__(self, server, port, timeout=5): + self.cmd = prefix + 'from calibre.parallel import worker; worker(%s, %s)'%(repr('localhost'), repr(port)) + self.process = popen([python, '-c', self.cmd]) + self.socket = server.accept()[0] - def kill(self, job_id): - ''' - Kill the job identified by job_id. - ''' - self.kill_jobs.append(str(job_id)) + self.working = False + self.timeout = timeout + self.last_job_time = time.time() + self.job_id = None + self._stop = False + if not select([self.socket], [], [], 120)[0]: + raise RuntimeError(_('Could not launch worker process.')) + if int(self.read()) != self.process.pid: + raise RuntimeError('PID mismatch') + self.write('OK') + if self.read() != 'WAITING': + raise RuntimeError('Worker sulking') - def _terminate(self, process): + def terminate(self): ''' Kill process. ''' + try: + if self.socket: + self.socket.close() + except: + pass if iswindows: win32api = __import__('win32api') try: - win32api.TerminateProcess(int(process.pid), -1) + win32api.TerminateProcess(int(self.process.pid), -1) except: pass else: import signal - os.kill(process.pid, signal.SIGKILL) - time.sleep(0.05) - - + try: + os.kill(self.process.pid, signal.SIGKILL) + time.sleep(0.05) + except: + pass - def run(self, job_id, func, args=[], kwdargs={}, monitor=True, - report_progress=True, qapp=True): - ''' - Run a job in a separate process. - @param job_id: A unique (per server) identifier - @param func: One of C{PARALLEL_FUNCS.keys()} - @param args: A list of arguments to pass of C{func} - @param kwdargs: A dictionary of keyword arguments to pass to C{func} - @param monitor: If False launch the child process and return. - Do not monitor/communicate with it. Automatically sets - `report_progress` and `qapp` to False. - @param report_progess: If True progress is reported to the GUI - @param qapp: If True, A QApplication is created. If False, progress reporting will also be disabled. - @return: (result, exception, formatted_traceback, log) where log is the combined - stdout + stderr of the child process; or None if monitor is True. If a job is killed - by a call to L{kill()} then result will be L{KILL_RESULT} - ''' - job_id = str(job_id) - job_dir = os.path.join(self.tdir, job_id) - if os.path.exists(job_dir): - raise ValueError('Cannot run job. The job_id %s has already been used.'%job_id) - os.mkdir(job_dir) - job_data = os.path.join(job_dir, 'job_data.pickle') - if not monitor: - report_progress = qapp = False - cPickle.dump((job_id, func, args, kwdargs, report_progress, qapp), - open(job_data, 'wb'), -1) - prefix = '' - if hasattr(sys, 'frameworks_dir'): - fd = getattr(sys, 'frameworks_dir') - prefix = 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd - if fd not in os.environ['PATH']: - os.environ['PATH'] += ':'+fd - cmd = prefix + 'from calibre.parallel import main; main(\'%s\')'%binascii.hexlify(job_data) + def write(self, msg, timeout=None): + write(self.socket, msg, timeout=self.timeout if timeout is None else timeout) - if not monitor: - popen([python, '-c', cmd]) + def read(self, timeout=None): + return read(self.socket, timeout=self.timeout if timeout is None else timeout) + + def __eq__(self, other): + return hasattr(other, 'process') and hasattr(other.process, 'pid') and self.process.pid == other.process.pid + + def __bool__(self): + self.process.poll() + return self.process.returncode is None + + def pid(self): + return self.process.pid + + def select(self, timeout=0): + return select([self.socket], [self.socket], [self.socket], timeout) + + def initialize_job(self, job): + self.job_id = job.job_id + self.working = True + self.write('JOB:'+cPickle.dumps((job.func, job.args, job.kwdargs), -1)) + msg = self.read() + if msg != 'OK': + raise ControlError('Failed to initialize job on worker %d:%s'%(self.process.pid, msg)) + self.output = job.output if callable(job.output) else sys.stdout.write + self.progress = job.progress if callable(job.progress) else None + self.job = job + + def control(self): + try: + if select([self.socket],[],[],0)[0]: + msg = self.read() + word, msg = msg.partition(':')[0], msg.partition(':')[-1] + if word == 'RESULT': + self.write('OK') + return Result(cPickle.loads(msg), None, None) + elif word == 'OUTPUT': + self.write('OK') + try: + self.output(''.join(cPickle.loads(msg))) + except: + self.output('Bad output message: '+ repr(msg)) + elif word == 'PROGRESS': + self.write('OK') + percent = None + try: + percent, msg = cPickle.loads(msg)[-1] + except: + print 'Bad progress update:', repr(msg) + if self.progress and percent is not None: + self.progress(percent, msg) + elif word == 'ERROR': + self.write('OK') + return Result(None, *cPickle.loads(msg)) + else: + self.terminate() + return Result(None, ControlError('Worker sent invalid msg: %s', repr(msg)), '') + self.process.poll() + if self.process.returncode is not None: + return Result(None, ControlError('Worker process died unexpectedly with returncode: %d'%self.process.returncode), '') + finally: + self.working = False + self.last_job_time = time.time() + +class Job(object): + + def __init__(self, job_id, func, args, kwdargs, output, progress, done): + self.job_id = job_id + self.func = func + self.args = args + self.kwdargs = kwdargs + self.output = output + self.progress = progress + self.done = done + +class Result(object): + + def __init__(self, result, exception, traceback): + self.result = result + self.exception = exception + self.traceback = traceback + + def __len__(self): + return 3 + + def __item__(self, i): + return (self.result, self.exception, self.traceback)[i] + + def __iter__(self): + return iter((self.result, self.exception, self.traceback)) + +class Server(Thread): + + KILL_RESULT = Overseer.KILL_RESULT + START_PORT = 10013 + + def __init__(self, number_of_workers=detect_ncpus()): + Thread.__init__(self) + self.setDaemon(True) + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.port = self.START_PORT + while True: + try: + self.server_socket.bind(('localhost', self.port)) + break + except: + self.port += 1 + self.server_socket.listen(5) + self.number_of_workers = number_of_workers + self.pool, self.jobs, self.working, self.results = [], collections.deque(), [], {} + atexit.register(self.killall) + self.job_lock = RLock() + self.overseer_lock = RLock() + self.working_lock = RLock() + self.result_lock = RLock() + self.pool_lock = RLock() + self.start() + + def add_job(self, job): + with self.job_lock: + self.jobs.append(job) + + def store_result(self, result, id=None): + if id: + with self.job_lock: + self.results[id] = result + + def result(self, id): + with self.result_lock: + return self.results.pop(id, None) + + def run(self): + while True: + job = None + with self.job_lock: + if len(self.jobs) > 0 and len(self.working) < self.number_of_workers: + job = self.jobs.popleft() + with self.pool_lock: + o = self.pool.pop() if self.pool else Overseer(self.server_socket, self.port) + try: + o.initialize_job(job) + except Exception, err: + res = Result(None, unicode(err), traceback.format_exc()) + job.done(res) + o.terminate() + o = None + if o: + with self.working_lock: + self.working.append(o) + + with self.working_lock: + done = [] + for o in self.working: + try: + res = o.control() + except Exception, err: + res = Result(None, unicode(err), traceback.format_exc()) + o.terminate() + if isinstance(res, Result): + o.job.done(res) + done.append(o) + for o in done: + self.working.remove(o) + if o: + with self.pool_lock: + self.pool.append(o) + + time.sleep(1) + + + def killall(self): + with self.pool_lock: + map(lambda x: x.terminate(), self.pool) + self.pool = [] + + + def kill(self, job_id): + with self.working_lock: + pop = None + for o in self.working: + if o.job_id == job_id: + o.terminate() + o.job.done(Result(self.KILL_RESULT, None, '')) + pop = o + break + if pop is not None: + self.working.remove(pop) + + + + def run_job(self, job_id, func, args=[], kwdargs={}, + output=None, progress=None, done=None): + ''' + Run a job in a separate process. Supports job control, output redirection + and progress reporting. + ''' + if done is None: + done = partial(self.store_result, id=job_id) + job = Job(job_id, func, args, kwdargs, output, progress, done) + with self.job_lock: + self.jobs.append(job) + + def run_free_job(self, func, args=[], kwdargs={}): + pt = PersistentTemporaryFile('.pickle', '_IPC_') + pt.write(cPickle.dumps((func, args, kwdargs))) + pt.close() + cmd = prefix + 'from calibre.parallel import free_spirit; free_spirit(%s)'%repr(pt.name) + popen([python, '-c', cmd]) + +########################################################################################## +##################################### CLIENT CODE ##################################### +########################################################################################## + +class BufferedSender(object): + + def __init__(self, socket): + self.socket = socket + self.wbuf, self.pbuf = [], [] + self.wlock, self.plock = RLock(), RLock() + self.timer = RepeatingTimer(0.5, self.send) + self.prefix = prefix + self.timer.start() + + def write(self, msg): + if not isinstance(msg, basestring): + msg = unicode(msg) + with self.wlock: + self.wbuf.append(msg) + + def send(self): + if not select([], [self.socket], [], 30)[1]: + print >>sys.__stderr__, 'Cannot pipe to overseer' return - output = open(os.path.join(job_dir, 'output.txt'), 'wb') - p = popen([python, '-c', cmd], stdout=output, stderr=output, - stdin=subprocess.PIPE) - p.stdin.close() - while p.returncode is None: - if job_id in self.kill_jobs: - self._terminate(p) - return self.KILL_RESULT, None, None, _('Job killed by user') - time.sleep(0.1) - p.poll() + with self.wlock: + if self.wbuf: + msg = cPickle.dumps(self.wbuf, -1) + self.wbuf = [] + write(self.socket, 'OUTPUT:'+msg) + read(self.socket, 10) + + with self.plock: + if self.pbuf: + msg = cPickle.dumps(self.pbuf, -1) + self.pbuf = [] + write(self.socket, 'PROGRESS:'+msg) + read(self.socket, 10) + + def notify(self, percent, msg=''): + with self.plock: + self.pbuf.append((percent, msg)) - - output.close() - job_result = os.path.join(job_dir, 'job_result.pickle') - if not os.path.exists(job_result): - result, exception, traceback = None, ('ParallelRuntimeError', - 'The worker process died unexpectedly.'), '' - else: - result, exception, traceback = cPickle.load(open(job_result, 'rb')) - log = open(output.name, 'rb').read() - - return result, exception, traceback, log - + def flush(self): + pass -def run_job(base, id, func, args, kwdargs): - global job_id - job_id = id - job_result = os.path.join(base, 'job_result.pickle') - +def work(client_socket, func, args, kwdargs): func = PARALLEL_FUNCS[func] - exception, tb = None, None + if hasattr(func, 'keywords'): + for key, val in func.keywords.items(): + if val == _notify: + func.keywords[key] = sys.stdout.notify + res = func(*args, **kwdargs) + sys.stdout.send() + return res + + + + +def worker(host, port): + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client_socket.connect((host, port)) + write(client_socket, str(os.getpid())) + msg = read(client_socket, timeout=10) + if msg != 'OK': + return 1 + write(client_socket, 'WAITING') + sys.stdout = BufferedSender(client_socket) + sys.stderr = sys.stdout + + while True: + msg = read(client_socket, timeout=60) + if msg.startswith('JOB:'): + func, args, kwdargs = cPickle.loads(msg[4:]) + write(client_socket, 'OK') + try: + result = work(client_socket, func, args, kwdargs) + write(client_socket, 'RESULT:'+ cPickle.dumps(result)) + except (Exception, SystemExit), err: + exception = (err.__class__.__name__, unicode(str(err), 'utf-8', 'replace')) + tb = traceback.format_exc() + write(client_socket, 'ERROR:'+cPickle.dumps((exception, tb),-1)) + if read(client_socket, 10) != 'OK': + break + gc.collect() + elif msg == 'STOP:': + return 0 + +def free_spirit(path): + func, args, kwdargs = cPickle.load(open(path, 'rb')) try: - result = func(*args, **kwdargs) - except (Exception, SystemExit), err: - result = None - exception = (err.__class__.__name__, unicode(str(err), 'utf-8', 'replace')) - tb = traceback.format_exc() - - if os.path.exists(os.path.dirname(job_result)): - cPickle.dump((result, exception, tb), open(job_result, 'wb')) - -def main(src): - from PyQt4.QtGui import QApplication - job_data = binascii.unhexlify(src) - global sa - job_id, func, args, kwdargs, rp, qapp = cPickle.load(open(job_data, 'rb')) - - if qapp and QApplication.instance() is None: - QApplication([]) - if SingleApplication is not None and rp and QApplication.instance() is not None: - sa = SingleApplication('calibre GUI') - - run_job(os.path.dirname(job_data), job_id, func, args, kwdargs) - - return 0 - -if __name__ == '__main__': - sys.exit(main(sys.argv[2])) - - + os.unlink(path) + except: + pass + PARALLEL_FUNCS[func](*args, **kwdargs) + \ No newline at end of file diff --git a/src/calibre/terminfo.py b/src/calibre/terminfo.py index 2141b9115b..2ed03a3077 100644 --- a/src/calibre/terminfo.py +++ b/src/calibre/terminfo.py @@ -94,7 +94,7 @@ class TerminalController: except: return # If the stream isn't a tty, then assume it has no capabilities. - if not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return + if hasattr(sys, 'in_worker') or not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return # Check the terminal type. If we fail, then assume that the # terminal has no capabilities. diff --git a/src/calibre/utils/single_qt_application.py b/src/calibre/utils/single_qt_application.py index 0c1eb0936a..78171a3dec 100644 --- a/src/calibre/utils/single_qt_application.py +++ b/src/calibre/utils/single_qt_application.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' Enforces running of only a single application instance and allows for messaging between applications using a local socket. ''' -import atexit +import atexit, os from PyQt4.QtCore import QByteArray, QDataStream, QIODevice, SIGNAL, QObject, Qt, QString from PyQt4.QtNetwork import QLocalSocket, QLocalServer @@ -93,6 +93,16 @@ class LocalServer(QLocalServer): for conn in pop: self.connections.remove(conn) + + def listen(self, name): + if not QLocalServer.listen(self, name): + try: + os.unlink(self.fullServerName()) + except: + pass + return QLocalServer.listen(self, name) + return True + @@ -124,8 +134,7 @@ class SingleApplication(QObject): self.mr, Qt.QueuedConnection) if not self.server.listen(self.server_name): - if not self.server.listen(self.server_name): - self.server = None + self.server = None if self.server is not None: atexit.register(self.server.close) From 103f8d91d949ead38735d7fde2076db5a92e560d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 19 Jun 2008 23:33:22 -0700 Subject: [PATCH 09/54] IGN:Remove uneccessary dependency on Qt mainloop when messaging the GUI from a commandline app --- src/calibre/library/cli.py | 27 +++++++++++----------- src/calibre/utils/single_qt_application.py | 7 +++++- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index edda1c8502..f76fb5bba7 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -11,7 +11,10 @@ import sys, os from textwrap import TextWrapper from calibre import OptionParser, Settings, terminal_controller, preferred_encoding -from calibre.gui2 import SingleApplication +try: + from calibre.utils.single_qt_application import send_message +except: + send_message = None from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata.opf import OPFCreator, OPFReader from calibre.library.database import LibraryDatabase, text_to_tokens @@ -181,10 +184,9 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): title = title.encode(preferred_encoding) print '\t', title+':' print '\t\t ', path - - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') + + if send_message is not None: + send_message('refreshdb:', 'calibre GUI') finally: sys.stdout = sys.__stdout__ @@ -222,10 +224,10 @@ def do_remove(db, ids): for y in x: db.delete_book(y) - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') - + if send_message is not None: + send_message('refreshdb:', 'calibre GUI') + + def command_remove(args, dbpath): parser = get_parser(_( '''\ @@ -337,10 +339,9 @@ def do_set_metadata(db, id, stream): mi = OPFReader(stream) db.set_metadata(id, mi) do_show_metadata(db, id, False) - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') - + if send_message is not None: + send_message('refreshdb:', 'calibre GUI') + def command_set_metadata(args, dbpath): parser = get_parser(_( ''' diff --git a/src/calibre/utils/single_qt_application.py b/src/calibre/utils/single_qt_application.py index 78171a3dec..846736c507 100644 --- a/src/calibre/utils/single_qt_application.py +++ b/src/calibre/utils/single_qt_application.py @@ -104,7 +104,12 @@ class LocalServer(QLocalServer): return True - +def send_message(msg, name, server_name='calibre_server', timeout=5000): + socket = QLocalSocket() + socket.connectToServer(server_name) + if socket.waitForConnected(timeout_connect): + if read_message(socket) == name: + write_message(socket, name+':'+msg, timeout) class SingleApplication(QObject): From d3075d163642a8dd2d467ee7408f7f3b69ddfedb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 09:14:52 -0700 Subject: [PATCH 10/54] IGN:Move to using mobileread for hosting the binaries --- osx_installer.py | 2 +- src/calibre/linux_installer.py | 4 +- src/calibre/trac/plugins/download.py | 13 +++-- upload.py | 80 +++++++++++++++++++++++----- windows_installer.py | 2 +- 5 files changed, 78 insertions(+), 23 deletions(-) diff --git a/osx_installer.py b/osx_installer.py index c42fe5f0a1..bd8b57a000 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -306,7 +306,7 @@ def main(): 'iconfile' : 'icons/library.icns', 'frameworks': ['libusb.dylib', 'libunrar.dylib'], 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', - 'PyQt4.QtSvg', + 'PyQt4.QtSvg', 'PyQt4.QtWebKit', 'mechanize', 'ClientForm', 'usbobserver', 'genshi', 'calibre.web.feeds.recipes.*', 'keyword', 'codeop', 'pydoc'], diff --git a/src/calibre/linux_installer.py b/src/calibre/linux_installer.py index 7a55d134d3..a4fc1cff77 100644 --- a/src/calibre/linux_installer.py +++ b/src/calibre/linux_installer.py @@ -8,6 +8,8 @@ Download and install the linux binary. ''' import sys, os, shutil, tarfile, subprocess, tempfile, urllib2, re, stat +MOBILEREAD='https://dev.mobileread.com/dist/kovid/calibre/' + class TerminalController: """ A class that can be used to portably generate formatted output to @@ -239,7 +241,7 @@ def do_postinstall(destdir): def download_tarball(): pb = ProgressBar(TerminalController(sys.stdout), 'Downloading calibre...') - src = urllib2.urlopen('http://calibre.kovidgoyal.net/downloads/latest-linux-binary.tar.bz2') + src = urllib2.urlopen(MOBILEREAD+'calibre-%version-i686.tar.bz2') size = int(src.info()['content-length']) f = tempfile.NamedTemporaryFile() while f.tell() < size: diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index e586a11f50..fe66dad363 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import re, glob +import re from pkg_resources import resource_filename from trac.core import Component, implements @@ -12,7 +12,7 @@ from trac.util import Markup __appname__ = 'calibre' DOWNLOAD_DIR = '/var/www/calibre.kovidgoyal.net/htdocs/downloads' LINUX_INSTALLER = '/var/www/calibre.kovidgoyal.net/calibre/src/calibre/linux_installer.py' - +MOBILEREAD = 'https://dev.mobileread.com/dist/kovid/calibre/' class OS(dict): """Dictionary with a default value for unknown keys.""" @@ -119,7 +119,7 @@ class Download(Component): if req.path_info == '/download': return self.top_level(req) elif req.path_info == '/download_linux_binary_installer': - req.send(open(LINUX_INSTALLER).read(), 'text/x-python') + req.send(open(LINUX_INSTALLER).read().replace('%version', self.version_from_filename()), 'text/x-python') else: match = re.match(r'\/download_(\S+)', req.path_info) if match: @@ -153,8 +153,7 @@ class Download(Component): def version_from_filename(self): try: - file = glob.glob(DOWNLOAD_DIR+'/*.exe')[0] - return re.search(r'\S+-(\d+\.\d+\.\d+)\.', file).group(1) + return open(DOWNLOAD_DIR+'/latest_version', 'rb').read().strip() except: return '0.0.0' @@ -165,7 +164,7 @@ class Download(Component): installer_name='Windows installer', title='Download %s for windows'%(__appname__), compatibility='%s works on Windows XP and Windows Vista.'%(__appname__,), - path='/downloads/'+file, app=__appname__, + path=MOBILEREAD+file, app=__appname__, note=Markup(\ '''

If you are using the SONY PRS-500 and %(appname)s does not detect your reader, read on:

@@ -203,7 +202,7 @@ You can uninstall a driver by right clicking on it and selecting uninstall. installer_name='OS X universal dmg', title='Download %s for OS X'%(__appname__), compatibility='%s works on OS X Tiger and above.'%(__appname__,), - path='/downloads/'+file, app=__appname__, + path=MOBILEREAD+file, app=__appname__, note=Markup(\ '''
    diff --git a/upload.py b/upload.py index 3ad07aa28a..8ec158c1db 100644 --- a/upload.py +++ b/upload.py @@ -1,5 +1,5 @@ #!/usr/bin/python -import sys, os, shutil, time, tempfile, socket, fcntl, struct +import sys, os, shutil, time, tempfile, socket, fcntl, struct, cStringIO, pycurl, re sys.path.append('src') import subprocess from subprocess import check_call as _check_call @@ -24,6 +24,7 @@ DOCS = PREFIX+"/htdocs/apidocs" USER_MANUAL = PREFIX+'/htdocs/user_manual' HTML2LRF = "src/calibre/ebooks/lrf/html/demo" TXT2LRF = "src/calibre/ebooks/lrf/txt/demo" +MOBILEREAD = 'ftp://dev.mobileread.com/calibre/' BUILD_SCRIPT ='''\ #!/bin/bash cd ~/build && \ @@ -110,19 +111,72 @@ def upload_demo(): check_call('cd src/calibre/ebooks/lrf/txt/demo/ && zip -j /tmp/txt-demo.zip * /tmp/txt2lrf.lrf') check_call('''scp /tmp/txt-demo.zip divok:%s/'''%(DOWNLOADS,)) +def curl_list_dir(url=MOBILEREAD, listonly=1): + c = pycurl.Curl() + c.setopt(pycurl.URL, url) + c.setopt(c.FTP_USE_EPSV, 1) + c.setopt(c.NETRC, c.NETRC_REQUIRED) + c.setopt(c.FTPLISTONLY, listonly) + c.setopt(c.FTP_CREATE_MISSING_DIRS, 1) + b = cStringIO.StringIO() + c.setopt(c.WRITEFUNCTION, b.write) + c.perform() + c.close() + return b.getvalue().split() if listonly else b.getvalue().splitlines() + +def curl_delete_file(path, url=MOBILEREAD): + c = pycurl.Curl() + c.setopt(pycurl.URL, url) + c.setopt(c.FTP_USE_EPSV, 1) + c.setopt(c.NETRC, c.NETRC_REQUIRED) + print 'Deleting file %s on %s'%(path, url) + c.setopt(c.QUOTE, ['dele '+ path]) + c.perform() + c.close() + + +def curl_upload_file(stream, url): + c = pycurl.Curl() + c.setopt(pycurl.URL, url) + c.setopt(pycurl.UPLOAD, 1) + c.setopt(c.NETRC, c.NETRC_REQUIRED) + c.setopt(pycurl.READFUNCTION, stream.read) + stream.seek(0, 2) + c.setopt(pycurl.INFILESIZE_LARGE, stream.tell()) + stream.seek(0) + c.setopt(c.NOPROGRESS, 0) + c.setopt(c.FTP_CREATE_MISSING_DIRS, 1) + print 'Uploading file %s to url %s' % (getattr(stream, 'name', ''), url) + try: + c.perform() + c.close() + except: + pass + files = curl_list_dir(listonly=0) + for line in files: + line = line.split() + if url.endswith(line[-1]): + size = long(line[4]) + stream.seek(0,2) + if size != stream.tell(): + raise RuntimeError('curl failed to upload %s correctly'%getattr(stream, 'name', '')) + + + +def upload_installer(name): + bname = os.path.basename(name) + pat = re.compile(bname.replace(__version__, r'\d+\.\d+\.\d+')) + for f in curl_list_dir(): + if pat.search(f): + curl_delete_file('/calibre/'+f) + curl_upload_file(open(name, 'rb'), MOBILEREAD+os.path.basename(name)) + def upload_installers(): - exe, dmg, tbz2 = installer_name('exe'), installer_name('dmg'), installer_name('tar.bz2') - if exe and os.path.exists(exe): - check_call('''ssh divok rm -f %s/calibre\*.exe'''%(DOWNLOADS,)) - check_call('''scp %s divok:%s/'''%(exe, DOWNLOADS)) - if dmg and os.path.exists(dmg): - check_call('''ssh divok rm -f %s/calibre\*.dmg'''%(DOWNLOADS,)) - check_call('''scp %s divok:%s/'''%(dmg, DOWNLOADS)) - if tbz2 and os.path.exists(tbz2): - check_call('''ssh divok rm -f %s/calibre-\*-i686.tar.bz2 %s/latest-linux-binary.tar.bz2'''%(DOWNLOADS,DOWNLOADS)) - check_call('''scp %s divok:%s/'''%(tbz2, DOWNLOADS)) - check_call('''ssh divok ln -s %s/calibre-\*-i686.tar.bz2 %s/latest-linux-binary.tar.bz2'''%(DOWNLOADS,DOWNLOADS)) - check_call('''ssh divok chmod a+r %s/\*'''%(DOWNLOADS,)) + for i in ('dmg', 'exe', 'tar.bz2'): + upload_installer(installer_name(i)) + + check_call('''ssh divok echo %s \\> %s/latest_version'''%(__version__, DOWNLOADS)) + def upload_docs(): check_call('''epydoc --config epydoc.conf''') diff --git a/windows_installer.py b/windows_installer.py index 06fa64d8ce..afabe531f8 100644 --- a/windows_installer.py +++ b/windows_installer.py @@ -564,7 +564,7 @@ def main(): 'win32file', 'pythoncom', 'rtf2xml', 'lxml', 'lxml._elementpath', 'genshi', 'path', 'pydoc', 'IPython.Extensions.*', - 'calibre.web.feeds.recipes.*', + 'calibre.web.feeds.recipes.*', 'PyQt4.QtWebKit', ], 'packages' : ['PIL'], 'excludes' : ["Tkconstants", "Tkinter", "tcl", From d0106bd4a0764b59980ee90b7dc92c035c68666b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 11:41:44 -0700 Subject: [PATCH 11/54] IGN:Fix rendering of tables to images to not always create full page images --- src/calibre/ebooks/lrf/html/table_as_image.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py index 4c5a79eab8..f4bdfa973d 100644 --- a/src/calibre/ebooks/lrf/html/table_as_image.py +++ b/src/calibre/ebooks/lrf/html/table_as_image.py @@ -46,9 +46,11 @@ class HTMLTableRenderer(QObject): painter = QPainter(image) self.page.mainFrame().render(painter) painter.end() + cheight = image.height() + cwidth = image.width() pos = 0 while pos < cheight: - img = image.copy(0, pos, cwidth, cutoff_height) + img = image.copy(0, pos, cwidth, min(cheight-pos, cutoff_height)) pos += cutoff_height-20 if cwidth > self.width: img = img.scaledToWidth(self.width, Qt.SmoothTransform) @@ -70,7 +72,7 @@ def render_table(server, soup, table, css, base_dir, width, height, dpi, factor= %s - + From 15305e3bea074f765a209d893d204986833d1e25 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 11:42:33 -0700 Subject: [PATCH 12/54] IGN:Fix new IPC framework on windows --- linux_installer.py | 2 +- src/calibre/parallel.py | 74 +++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/linux_installer.py b/linux_installer.py index 315b2d8486..7556f438fb 100644 --- a/linux_installer.py +++ b/linux_installer.py @@ -74,7 +74,7 @@ f.write(hook_script) sys.path.insert(0, CALIBRESRC) from calibre.linux import entry_points -executables, scripts = ['calibre_postinstall', 'parallel'], \ +executables, scripts = ['calibre_postinstall', 'calibre-parallel'], \ [os.path.join(CALIBRESRC, 'calibre', 'linux.py'), os.path.join(CALIBRESRC, 'calibre', 'parallel.py')] for entry in entry_points['console_scripts'] + entry_points['gui_scripts']: diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 1c9593b94f..5ba20d28aa 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -47,10 +47,10 @@ if iswindows: python = os.path.join(os.path.dirname(python), 'parallel.exe') else: python = os.path.join(os.path.dirname(python), 'Scripts\\parallel.exe') - popen = partial(subprocess.Popen, creationflags=0x08) # CREATE_NO_WINDOW=0x08 so that no ugly console is popped up + open = partial(subprocess.Popen, creationflags=0x08) # CREATE_NO_WINDOW=0x08 so that no ugly console is popped up if islinux and hasattr(sys, 'frozen_path'): - python = os.path.join(getattr(sys, 'frozen_path'), 'parallel') + python = os.path.join(getattr(sys, 'frozen_path'), 'calibre-parallel') popen = partial(subprocess.Popen, cwd=getattr(sys, 'frozen_path')) prefix = 'import sys; sys.in_worker = True; ' @@ -59,7 +59,14 @@ if hasattr(sys, 'frameworks_dir'): prefix += 'sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd if fd not in os.environ['PATH']: os.environ['PATH'] += ':'+fd - +if 'parallel' in python: + executable = [python] + worker_command = '%s:%s' + free_spirit_command = '%s' +else: + executable = [python, '-c'] + worker_command = prefix + 'from calibre.parallel import worker; worker(%s, %s)' + free_spirit_command = prefix + 'from calibre.parallel import free_spirit; free_spirit(%s)' def write(socket, msg, timeout=5): if isinstance(msg, unicode): @@ -124,8 +131,8 @@ class Overseer(object): INTERVAL = 0.1 def __init__(self, server, port, timeout=5): - self.cmd = prefix + 'from calibre.parallel import worker; worker(%s, %s)'%(repr('localhost'), repr(port)) - self.process = popen([python, '-c', self.cmd]) + self.cmd = worker_command%(repr('127.0.0.1'), repr(port)) + self.process = popen(executable + [self.cmd]) self.socket = server.accept()[0] self.working = False @@ -135,8 +142,10 @@ class Overseer(object): self._stop = False if not select([self.socket], [], [], 120)[0]: raise RuntimeError(_('Could not launch worker process.')) - if int(self.read()) != self.process.pid: - raise RuntimeError('PID mismatch') + ID = self.read().split(':') + if ID[0] != 'CALIBRE_WORKER': + raise RuntimeError('Impostor') + self.worker_pid = int(ID[1]) self.write('OK') if self.read() != 'WAITING': raise RuntimeError('Worker sulking') @@ -147,19 +156,22 @@ class Overseer(object): ''' try: if self.socket: - self.socket.close() + self.write('STOP:') + time.sleep(1) + self.socket.shutdown(socket.SHUT_RDWR) except: pass if iswindows: win32api = __import__('win32api') try: - win32api.TerminateProcess(int(self.process.pid), -1) + handle = win32api.OpenProcess(1, False, self.worker_pid) + win32api.TerminateProcess(handle, -1) except: pass else: import signal try: - os.kill(self.process.pid, signal.SIGKILL) + os.kill(self.worker_pid, signal.SIGKILL) time.sleep(0.05) except: pass @@ -172,14 +184,14 @@ class Overseer(object): return read(self.socket, timeout=self.timeout if timeout is None else timeout) def __eq__(self, other): - return hasattr(other, 'process') and hasattr(other.process, 'pid') and self.process.pid == other.process.pid + return hasattr(other, 'process') and hasattr(other, 'worker_pid') and self.worker_pid == other.worker_pid def __bool__(self): self.process.poll() return self.process.returncode is None def pid(self): - return self.process.pid + return self.worker_pid def select(self, timeout=0): return select([self.socket], [self.socket], [self.socket], timeout) @@ -190,7 +202,7 @@ class Overseer(object): self.write('JOB:'+cPickle.dumps((job.func, job.args, job.kwdargs), -1)) msg = self.read() if msg != 'OK': - raise ControlError('Failed to initialize job on worker %d:%s'%(self.process.pid, msg)) + raise ControlError('Failed to initialize job on worker %d:%s'%(self.worker_pid, msg)) self.output = job.output if callable(job.output) else sys.stdout.write self.progress = job.progress if callable(job.progress) else None self.job = job @@ -278,6 +290,7 @@ class Server(Thread): self.number_of_workers = number_of_workers self.pool, self.jobs, self.working, self.results = [], collections.deque(), [], {} atexit.register(self.killall) + atexit.register(self.close) self.job_lock = RLock() self.overseer_lock = RLock() self.working_lock = RLock() @@ -285,6 +298,12 @@ class Server(Thread): self.pool_lock = RLock() self.start() + def close(self): + try: + self.server_socket.shutdown(socket.SHUT_RDWR) + except: + pass + def add_job(self, job): with self.job_lock: self.jobs.append(job) @@ -373,8 +392,8 @@ class Server(Thread): pt = PersistentTemporaryFile('.pickle', '_IPC_') pt.write(cPickle.dumps((func, args, kwdargs))) pt.close() - cmd = prefix + 'from calibre.parallel import free_spirit; free_spirit(%s)'%repr(pt.name) - popen([python, '-c', cmd]) + cmd = free_spirit_command%repr(pt.name) + popen(executable + [cmd]) ########################################################################################## ##################################### CLIENT CODE ##################################### @@ -426,26 +445,26 @@ def work(client_socket, func, args, kwdargs): func = PARALLEL_FUNCS[func] if hasattr(func, 'keywords'): for key, val in func.keywords.items(): - if val == _notify: + if val == _notify and hasattr(sys.stdout, 'notify'): func.keywords[key] = sys.stdout.notify res = func(*args, **kwdargs) - sys.stdout.send() + if hasattr(sys.stdout, 'send'): + sys.stdout.send() return res - - def worker(host, port): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((host, port)) - write(client_socket, str(os.getpid())) + write(client_socket, 'CALIBRE_WORKER:%d'%os.getpid()) msg = read(client_socket, timeout=10) if msg != 'OK': return 1 write(client_socket, 'WAITING') + sys.stdout = BufferedSender(client_socket) sys.stderr = sys.stdout - + while True: msg = read(client_socket, timeout=60) if msg.startswith('JOB:'): @@ -463,6 +482,8 @@ def worker(host, port): gc.collect() elif msg == 'STOP:': return 0 + elif not msg: + time.sleep(1) def free_spirit(path): func, args, kwdargs = cPickle.load(open(path, 'rb')) @@ -471,4 +492,15 @@ def free_spirit(path): except: pass PARALLEL_FUNCS[func](*args, **kwdargs) + +def main(args=sys.argv): + args = args[1].split(':') + if len(args) == 1: + free_spirit(args[0]) + else: + worker(args[0].replace("'", ''), int(args[1])) + return 0 + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file From af4be77ae28337bf4d1ea742613c16252a3c06c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 13:02:54 -0700 Subject: [PATCH 13/54] Fix #799 --- src/calibre/devices/prs505/driver.py | 20 ++++++++++++++++---- src/calibre/gui2/library.py | 5 +++-- src/calibre/gui2/main.py | 19 +++++++++++-------- src/calibre/parallel.py | 12 ++++++++---- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 0050e091d3..4f2e98b4f7 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -353,9 +353,16 @@ class PRS505(Device): def upload_books(self, files, names, on_card=False, end_session=True): path = os.path.join(self._card_prefix, self.CARD_PATH_PREFIX) if on_card \ else os.path.join(self._main_prefix, 'database', 'media', 'books') - infiles = [file if hasattr(file, 'read') else open(file, 'rb') for file in files] - for f in infiles: f.seek(0, 2) - sizes = [f.tell() for f in infiles] + + def get_size(obj): + if hasattr(obj, 'seek'): + obj.seek(0, 2) + size = obj.tell() + obj.seek(0) + return size + return os.path.getsize(obj) + + sizes = map(get_size, files) size = sum(sizes) space = self.free_space() mspace = space[0] @@ -370,13 +377,18 @@ class PRS505(Device): paths, ctimes = [], [] names = iter(names) - for infile in infiles: + for infile in files: + close = False + if not hasattr(infile, 'read'): + infile, close = open(infile, 'rb'), True infile.seek(0) name = names.next() paths.append(os.path.join(path, name)) if not os.path.exists(os.path.dirname(paths[-1])): os.makedirs(os.path.dirname(paths[-1])) self.put_file(infile, paths[-1], replace_file=True) + if close: + infile.close() ctimes.append(os.path.getctime(paths[-1])) return zip(paths, sizes, ctimes, cycle([on_card])) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 5ede2b49a0..ce9db76eed 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -312,7 +312,7 @@ class BooksModel(QAbstractTableModel): metadata.append(mi) return metadata - def get_preferred_formats(self, rows, formats): + def get_preferred_formats(self, rows, formats, paths=False): ans = [] for row in (row.row() for row in rows): format = None @@ -323,7 +323,8 @@ class BooksModel(QAbstractTableModel): if format: pt = PersistentTemporaryFile(suffix='.'+format) pt.write(self.db.format(row, format)) - pt.seek(0) + pt.flush() + pt.close() if paths else pt.seek(0) ans.append(pt) else: ans.append(None) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index a567bc567d..e856d748f0 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -466,7 +466,7 @@ class Main(MainWindow, Ui_MainWindow): else: self.upload_books(paths, names, infos, on_card=on_card) - def upload_books(self, files, names, metadata, on_card=False): + def upload_books(self, files, names, metadata, on_card=False, memory=None): ''' Upload books to device. @param files: List of either paths to files or file like objects @@ -477,13 +477,13 @@ class Main(MainWindow, Ui_MainWindow): files, names, on_card=on_card, job_extra_description=titles ) - self.upload_memory[id] = (metadata, on_card) + self.upload_memory[id] = (metadata, on_card, memory) def books_uploaded(self, id, description, result, exception, formatted_traceback): ''' Called once books have been uploaded. ''' - metadata, on_card = self.upload_memory.pop(id) + metadata, on_card = self.upload_memory.pop(id)[:2] if exception: if isinstance(exception, FreeSpaceError): where = 'in main memory.' if 'memory' in str(exception) else 'on the storage card.' @@ -611,8 +611,9 @@ class Main(MainWindow, Ui_MainWindow): if cdata: mi['cover'] = self.cover_to_thumbnail(cdata) metadata = iter(metadata) - files = self.library_view.model().get_preferred_formats(rows, - self.device_manager.device_class.FORMATS) + _files = self.library_view.model().get_preferred_formats(rows, + self.device_manager.device_class.FORMATS, paths=True) + files = [f.name for f in _files] bad, good, gf, names = [], [], [], [] for f in files: mi = metadata.next() @@ -627,7 +628,9 @@ class Main(MainWindow, Ui_MainWindow): try: smi = MetaInformation(mi['title'], aus2) smi.comments = mi.get('comments', None) - set_metadata(f, smi, f.name.rpartition('.')[2]) + _f = open(f, 'r+b') + set_metadata(_f, smi, f.rpartition('.')[2]) + _f.close() except: print 'Error setting metadata in book:', mi['title'] traceback.print_exc() @@ -644,8 +647,8 @@ class Main(MainWindow, Ui_MainWindow): prefix = prefix.encode('ascii', 'ignore') else: prefix = prefix.decode('ascii', 'ignore').encode('ascii', 'ignore') - names.append('%s_%d%s'%(prefix, id, os.path.splitext(f.name)[1])) - self.upload_books(gf, names, good, on_card) + names.append('%s_%d%s'%(prefix, id, os.path.splitext(f)[1])) + self.upload_books(gf, names, good, on_card, memory=_files) self.status_bar.showMessage(_('Sending books to device.'), 5000) if bad: bad = '\n'.join('
  1. %s
  2. '%(i,) for i in bad) diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 5ba20d28aa..7c0c997def 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -4,7 +4,8 @@ __copyright__ = '2008, Kovid Goyal ' ''' Used to run jobs in parallel in separate processes. ''' -import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, subprocess, socket, collections +import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, \ + subprocess, socket, collections, binascii from select import select from functools import partial from threading import RLock, Thread, Event @@ -392,7 +393,7 @@ class Server(Thread): pt = PersistentTemporaryFile('.pickle', '_IPC_') pt.write(cPickle.dumps((func, args, kwdargs))) pt.close() - cmd = free_spirit_command%repr(pt.name) + cmd = free_spirit_command%repr(binascii.hexlify(pt.name)) popen(executable + [cmd]) ########################################################################################## @@ -484,9 +485,12 @@ def worker(host, port): return 0 elif not msg: time.sleep(1) + else: + print >>sys.__stderr__, 'Invalid protocols message', msg + return 1 def free_spirit(path): - func, args, kwdargs = cPickle.load(open(path, 'rb')) + func, args, kwdargs = cPickle.load(open(binascii.unhexlify(path), 'rb')) try: os.unlink(path) except: @@ -496,7 +500,7 @@ def free_spirit(path): def main(args=sys.argv): args = args[1].split(':') if len(args) == 1: - free_spirit(args[0]) + free_spirit(args[0].replace("'", '')) else: worker(args[0].replace("'", ''), int(args[1])) return 0 From 41c447a0d24978b55ce5b90222d09b35857143d5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 13:19:40 -0700 Subject: [PATCH 14/54] Fix #777 --- src/calibre/ebooks/mobi/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 2c96846aae..38fa1a6175 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -156,7 +156,7 @@ class MobiReader(object): processed_records = self.extract_text() self.add_anchors() - self.processed_html = self.processed_html.decode(self.book_header.codec) + self.processed_html = self.processed_html.decode(self.book_header.codec, 'ignore') self.extract_images(processed_records, output_dir) self.replace_page_breaks() self.cleanup() From 7501dbbe6504f0475cff543eb14fe5dc58492e22 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 13:36:54 -0700 Subject: [PATCH 15/54] Fix #777 --- src/calibre/ebooks/mobi/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 38fa1a6175..99184d9244 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -177,7 +177,7 @@ class MobiReader(object): opf.render(open(os.path.splitext(htmlfile)[0]+'.opf', 'wb')) def cleanup(self): - self.processed_html = re.sub(r'
    ', '', self.processed_html) + self.processed_html = re.sub(r'
    ', '', self.processed_html) def create_opf(self, htmlfile): mi = self.book_header.exth.mi From e49db6236b58d9b0979c4f01fa0ab09127d1dd19 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 13:43:27 -0700 Subject: [PATCH 16/54] Fix #802 --- src/calibre/ebooks/metadata/__init__.py | 2 +- src/calibre/ebooks/metadata/opf.py | 2 ++ src/calibre/library/database.py | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 2f14441faa..2ca67e526d 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -38,7 +38,7 @@ class MetaInformation(object): setattr(ans, attr, getattr(mi, attr)) - def __init__(self, title, authors=['Unknown']): + def __init__(self, title, authors=[_('Unknown')]): ''' @param title: title or "Unknown" or a MetaInformation object @param authors: List of strings or [] diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index 021b63ac08..bff9ed5f8a 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -511,6 +511,8 @@ class OPFCreator(MetaInformation): path = path[len(self.base_path)+1:] manifest.append((path, mt)) self.manifest = manifest + if not self.authors: + self.authors = [_('Unknown')] def create_manifest(self, entries): ''' diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index dc4f4e31de..9d54afc88c 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1427,6 +1427,8 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; open(cpath, 'wb').write(cover) mi.cover = cname f = open(os.path.join(base, sanitize_file_name(name)+'.opf'), 'wb') + if not mi.authors: + mi.authors = [_('Unknown')] mi.render(f) f.close() From 520328c1966065371c508f45227acaf8da29f320 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 14:23:56 -0700 Subject: [PATCH 17/54] Improve title, author and subject detection for mobi files --- src/calibre/ebooks/mobi/reader.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 99184d9244..b89fcc2324 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -44,27 +44,29 @@ class EXTHHeader(object): self.cover_offset, = struct.unpack('>L', content) elif id == 202: self.thumbnail_offset, = struct.unpack('>L', content) - pos += 3 - stop = raw[pos:].find('\x00') - if stop > -1: - self.mi.title = raw[pos:pos+stop].decode(codec, 'ignore') + title = re.search(r'\0+([^\0]+)\0+', raw[pos:]) + if title: + self.mi.title = title.group(1).decode(codec, 'ignore') def process_metadata(self, id, content, codec): if id == 100: aus = content.split(',') - authors = [] - for a in aus: - authors.extend(a.split('&')) - self.mi.authors = [i.decode(codec, 'ignore') for i in authors] + if len(aus) > 0: + self.mi.author_sort = aus[0].decode(codec, 'ignore').strip() + self.mi.authors = [aus[1].decode(codec, 'ignore').strip()] + else: + self.mi.authors = [aus[0].decode(codec, 'ignore').strip()] elif id == 101: - self.mi.publisher = content.decode(codec, 'ignore') + self.mi.publisher = content.decode(codec, 'ignore').strip() elif id == 103: self.mi.comments = content.decode(codec, 'ignore') elif id == 104: self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '') elif id == 105: - self.mi.category = content.decode(codec, 'ignore') + if not self.mi.tags: + self.mi.tags = [] + self.mi.tags.append(content.decode(codec, 'ignore')) From d3691a7be28fb9eafa709a16693267d25b16e7b5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 20 Jun 2008 15:42:44 -0700 Subject: [PATCH 18/54] Add support for language codes to mobi2oeb --- src/calibre/ebooks/metadata/__init__.py | 8 +- src/calibre/ebooks/metadata/opf.xml | 7 +- src/calibre/ebooks/mobi/langcodes.py | 159 ++++++++++++++++++++++++ src/calibre/ebooks/mobi/reader.py | 20 +-- 4 files changed, 182 insertions(+), 12 deletions(-) create mode 100644 src/calibre/ebooks/mobi/langcodes.py diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 2ca67e526d..f744bb7f41 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -33,7 +33,7 @@ class MetaInformation(object): for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'tags', 'cover_data', 'application_id', - 'manifest', 'spine', 'toc', 'cover'): + 'manifest', 'spine', 'toc', 'cover', 'language'): if hasattr(mi, attr): setattr(ans, attr, getattr(mi, attr)) @@ -63,6 +63,7 @@ class MetaInformation(object): self.rating = None if not mi else mi.rating self.isbn = None if not mi else mi.isbn self.tags = [] if not mi else mi.tags + self.language = None if not mi else mi.language # Typically a string describing the language #: mi.cover_data = (ext, data) self.cover_data = mi.cover_data if (mi and hasattr(mi, 'cover_data')) else (None, None) self.application_id = mi.application_id if (mi and hasattr(mi, 'application_id')) else None @@ -84,7 +85,8 @@ class MetaInformation(object): for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'application_id', 'manifest', 'spine', 'toc', 'cover'): + 'isbn', 'application_id', 'manifest', 'spine', 'toc', + 'cover', 'language'): if hasattr(mi, attr): val = getattr(mi, attr) if val is not None: @@ -115,6 +117,8 @@ class MetaInformation(object): ans += u'Tags : ' +unicode(self.tags) + '\n' if self.series: ans += u'Series : '+unicode(self.series) + '(%d)'%self.series_index + if self.language: + ans += u'Language : ' + unicode(self.language) + u'\n' return ans.strip() def __nonzero__(self): diff --git a/src/calibre/ebooks/metadata/opf.xml b/src/calibre/ebooks/metadata/opf.xml index f2c719d7f6..ed54c10a32 100644 --- a/src/calibre/ebooks/metadata/opf.xml +++ b/src/calibre/ebooks/metadata/opf.xml @@ -9,7 +9,8 @@ ${mi.title} ${author} ${mi.application_id} - + + ${mi.language if mi.language else 'Unknown'} ${mi.category} ${mi.comments} ${mi.publisher} @@ -17,7 +18,9 @@ ${mi.series} ${mi.series_index} ${mi.rating} - ${tag} + + ${tag} + diff --git a/src/calibre/ebooks/mobi/langcodes.py b/src/calibre/ebooks/mobi/langcodes.py new file mode 100644 index 0000000000..c0884e55a8 --- /dev/null +++ b/src/calibre/ebooks/mobi/langcodes.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +main_language = { + 0 : "NEUTRAL", + 54 : "AFRIKAANS", + 28 : "ALBANIAN", + 1 : "ARABIC", + 43 : "ARMENIAN", + 77 : "ASSAMESE", + 44 : "AZERI", + 45 : "BASQUE", + 35 : "BELARUSIAN", + 69 : "BENGALI", + 2 : "BULGARIAN", + 3 : "CATALAN", + 4 : "CHINESE", + 26 : "CROATIAN", + 5 : "CZECH", + 6 : "DANISH", + 19 : "DUTCH", + 9 : "ENGLISH", + 37 : "ESTONIAN", + 56 : "FAEROESE", + 41 : "FARSI", + 11 : "FINNISH", + 12 : "FRENCH", + 55 : "GEORGIAN", + 7 : "GERMAN", + 8 : "GREEK", + 71 : "GUJARATI", + 13 : "HEBREW", + 57 : "HINDI", + 14 : "HUNGARIAN", + 15 : "ICELANDIC", + 33 : "INDONESIAN", + 16 : "ITALIAN", + 17 : "JAPANESE", + 75 : "KANNADA", + 63 : "KAZAK", + 87 : "KONKANI", + 18 : "KOREAN", + 38 : "LATVIAN", + 39 : "LITHUANIAN", + 47 : "MACEDONIAN", + 62 : "MALAY", + 76 : "MALAYALAM", + 58 : "MALTESE", + 78 : "MARATHI", + 97 : "NEPALI", + 20 : "NORWEGIAN", + 72 : "ORIYA", + 21 : "POLISH", + 22 : "PORTUGUESE", + 70 : "PUNJABI", + 23 : "RHAETOROMANIC", + 24 : "ROMANIAN", + 25 : "RUSSIAN", + 59 : "SAMI", + 79 : "SANSKRIT", + 26 : "SERBIAN", + 27 : "SLOVAK", + 36 : "SLOVENIAN", + 46 : "SORBIAN", + 10 : "SPANISH", + 48 : "SUTU", + 65 : "SWAHILI", + 29 : "SWEDISH", + 73 : "TAMIL", + 68 : "TATAR", + 74 : "TELUGU", + 30 : "THAI", + 49 : "TSONGA", + 50 : "TSWANA", + 31 : "TURKISH", + 34 : "UKRAINIAN", + 32 : "URDU", + 67 : "UZBEK", + 42 : "VIETNAMESE", + 52 : "XHOSA", + 53 : "ZULU", +} + +sub_language = { + 0 : "NEUTRAL", + 1 : "ARABIC_SAUDI_ARABIA", + 2 : "ARABIC_IRAQ", + 3 : "ARABIC_EGYPT", + 4 : "ARABIC_LIBYA", + 5 : "ARABIC_ALGERIA", + 6 : "ARABIC_MOROCCO", + 7 : "ARABIC_TUNISIA", + 8 : "ARABIC_OMAN", + 9 : "ARABIC_YEMEN", + 10 : "ARABIC_SYRIA", + 11 : "ARABIC_JORDAN", + 12 : "ARABIC_LEBANON", + 13 : "ARABIC_KUWAIT", + 14 : "ARABIC_UAE", + 15 : "ARABIC_BAHRAIN", + 16 : "ARABIC_QATAR", + 1 : "AZERI_LATIN", + 2 : "AZERI_CYRILLIC", + 1 : "CHINESE_TRADITIONAL", + 2 : "CHINESE_SIMPLIFIED", + 3 : "CHINESE_HONGKONG", + 4 : "CHINESE_SINGAPORE", + 1 : "DUTCH", + 2 : "DUTCH_BELGIAN", + 1 : "FRENCH", + 2 : "FRENCH_BELGIAN", + 3 : "FRENCH_CANADIAN", + 4 : "FRENCH_SWISS", + 5 : "FRENCH_LUXEMBOURG", + 6 : "FRENCH_MONACO", + 1 : "GERMAN", + 2 : "GERMAN_SWISS", + 3 : "GERMAN_AUSTRIAN", + 4 : "GERMAN_LUXEMBOURG", + 5 : "GERMAN_LIECHTENSTEIN", + 1 : "ITALIAN", + 2 : "ITALIAN_SWISS", + 1 : "KOREAN", + 1 : "LITHUANIAN", + 1 : "MALAY_MALAYSIA", + 2 : "MALAY_BRUNEI_DARUSSALAM", + 1 : "NORWEGIAN_BOKMAL", + 2 : "NORWEGIAN_NYNORSK", + 2 : "PORTUGUESE", + 1 : "PORTUGUESE_BRAZILIAN", + 2 : "SERBIAN_LATIN", + 3 : "SERBIAN_CYRILLIC", + 1 : "SPANISH", + 2 : "SPANISH_MEXICAN", + 4 : "SPANISH_GUATEMALA", + 5 : "SPANISH_COSTA_RICA", + 6 : "SPANISH_PANAMA", + 7 : "SPANISH_DOMINICAN_REPUBLIC", + 8 : "SPANISH_VENEZUELA", + 9 : "SPANISH_COLOMBIA", + 10 : "SPANISH_PERU", + 11 : "SPANISH_ARGENTINA", + 12 : "SPANISH_ECUADOR", + 13 : "SPANISH_CHILE", + 14 : "SPANISH_URUGUAY", + 15 : "SPANISH_PARAGUAY", + 16 : "SPANISH_BOLIVIA", + 17 : "SPANISH_EL_SALVADOR", + 18 : "SPANISH_HONDURAS", + 19 : "SPANISH_NICARAGUA", + 20 : "SPANISH_PUERTO_RICO", + 1 : "SWEDISH", + 2 : "SWEDISH_FINLAND", + 1 : "UZBEK_LATIN", + 2 : "UZBEK_CYRILLIC", + + } \ No newline at end of file diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index b89fcc2324..8f314026f8 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -17,6 +17,7 @@ from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.mobi import MobiError from calibre.ebooks.mobi.huffcdic import HuffReader from calibre.ebooks.mobi.palmdoc import decompress_doc +from calibre.ebooks.mobi.langcodes import main_language, sub_language from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf import OPFCreator @@ -51,18 +52,13 @@ class EXTHHeader(object): def process_metadata(self, id, content, codec): if id == 100: - aus = content.split(',') - if len(aus) > 0: - self.mi.author_sort = aus[0].decode(codec, 'ignore').strip() - self.mi.authors = [aus[1].decode(codec, 'ignore').strip()] - else: - self.mi.authors = [aus[0].decode(codec, 'ignore').strip()] + self.mi.authors = [content.decode(codec, 'ignore').strip()] elif id == 101: self.mi.publisher = content.decode(codec, 'ignore').strip() elif id == 103: - self.mi.comments = content.decode(codec, 'ignore') + self.mi.comments = content.decode(codec, 'ignore') elif id == 104: - self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '') + self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '') elif id == 105: if not self.mi.tags: self.mi.tags = [] @@ -76,6 +72,7 @@ class BookHeader(object): self.compression_type = raw[:2] self.records, self.records_size = struct.unpack('>HH', raw[8:12]) self.encryption_type, = struct.unpack('>H', raw[12:14]) + self.doctype = raw[16:20] self.length, self.type, self.codepage, self.unique_id, self.version = \ struct.unpack('>LLLLL', raw[20:40]) @@ -100,11 +97,18 @@ class BookHeader(object): if self.compression_type == 'DH': self.huff_offset, self.huff_number = struct.unpack('>LL', raw[0x70:0x78]) + langcode = struct.unpack('!L', raw[0x5C:0x60])[0] + langid = langcode & 0xFF + sublangid = (langcode >> 10) & 0xFF + self.language = main_language.get(langid, 'ENGLISH') + self.sublanguage = sub_language.get(sublangid, 'NEUTRAL') + self.exth_flag, = struct.unpack('>L', raw[0x80:0x84]) self.exth = None if self.exth_flag & 0x40: self.exth = EXTHHeader(raw[16+self.length:], self.codec) self.exth.mi.uid = self.unique_id + self.exth.mi.language = self.language class MobiReader(object): From 39d6c724d36d007ac295c37888df7ee87364dd58 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 21 Jun 2008 03:47:48 -0700 Subject: [PATCH 19/54] IGN:Remove some bugs in SVG files --- src/calibre/gui2/images/dialog_information.svg | 7 ------- src/calibre/gui2/images/mimetypes/lit.svg | 9 --------- src/calibre/gui2/images/sync.svg | 9 --------- 3 files changed, 25 deletions(-) diff --git a/src/calibre/gui2/images/dialog_information.svg b/src/calibre/gui2/images/dialog_information.svg index b43e46c5e9..995f74cd78 100644 --- a/src/calibre/gui2/images/dialog_information.svg +++ b/src/calibre/gui2/images/dialog_information.svg @@ -2946,13 +2946,6 @@ id="defs155" /> - - - Date: Sat, 21 Jun 2008 15:45:47 -0700 Subject: [PATCH 20/54] Fix #806 --- src/calibre/library/cli.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index f76fb5bba7..bce926ad35 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -100,14 +100,14 @@ List the books available in the calibre database. if not set(fields).issubset(FIELDS): parser.print_help() print - print _('Invalid fields. Available fields:'), ','.join(FIELDS) + print >>sys.stderr, _('Invalid fields. Available fields:'), ','.join(FIELDS) return 1 db = get_db(dbpath, opts) if not opts.sort_by in FIELDS: parser.print_help() print - print _('Invalid sort field. Available fields:'), ','.join(FIELDS) + print >>sys.stderr, _('Invalid sort field. Available fields:'), ','.join(FIELDS) return 1 do_list(db, fields, opts.sort_by, opts.ascending, opts.search) @@ -121,6 +121,7 @@ class DevNull(object): NULL = DevNull() def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): + orig = sys.stdout sys.stdout = NULL try: files, dirs = [], [] @@ -169,26 +170,26 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): for mi, formats in dir_dups: db.import_book(mi, formats) else: - print _('The following books were not added as they already exist in the database (see --duplicates option):') + print >>sys.stderr, _('The following books were not added as they already exist in the database (see --duplicates option):') for mi, formats in dir_dups: title = mi.title if isinstance(title, unicode): title = title.encode(preferred_encoding) - print '\t', title + ':' + print >>sys.stderr, '\t', title + ':' for path in formats: - print '\t\t ', path + print >>sys.stderr, '\t\t ', path if file_duplicates: for path, mi in zip(file_duplicates[0], file_duplicates[2]): title = mi.title if isinstance(title, unicode): title = title.encode(preferred_encoding) - print '\t', title+':' - print '\t\t ', path + print >>sys.stderr, '\t', title+':' + print >>sys.stderr, '\t\t ', path if send_message is not None: send_message('refreshdb:', 'calibre GUI') finally: - sys.stdout = sys.__stdout__ + sys.stdout = orig @@ -211,7 +212,7 @@ the directory related options below. if len(args) < 2: parser.print_help() print - print _('You must specify at least one file to add') + print >>sys.stderr, _('You must specify at least one file to add') return 1 do_add(get_db(dbpath, opts), args[1:], opts.one_book_per_directory, opts.recurse, opts.duplicates) return 0 @@ -241,7 +242,7 @@ list of id numbers (you can get id numbers by using the list command). For examp if len(args) < 2: parser.print_help() print - print _('You must specify at least one book to remove') + print >>sys.stderr, _('You must specify at least one book to remove') return 1 ids = [] @@ -272,7 +273,7 @@ by id. You can get id by using the list command. If the format already exists, i if len(args) < 3: parser.print_help() print - print _('You must specify an id and an ebook file') + print >>sys.stderr, _('You must specify an id and an ebook file') return 1 id, file, fmt = int(args[1]), open(args[2], 'rb'), os.path.splitext(args[2])[-1] @@ -298,7 +299,7 @@ do nothing. if len(args) < 3: parser.print_help() print - print _('You must specify an id and a format') + print >>sys.stderr, _('You must specify an id and a format') return 1 id, fmt = int(args[1]), args[2].upper() @@ -329,7 +330,7 @@ id is an id number from the list command. if len(args) < 2: parser.print_help() print - print _('You must specify an id') + print >>sys.stderr, _('You must specify an id') return 1 id = int(args[1]) do_show_metadata(get_db(dbpath, opts), id, opts.as_opf) @@ -356,7 +357,7 @@ show_metadata command. if len(args) < 3: parser.print_help() print - print _('You must specify an id and a metadata file') + print >>sys.stderr, _('You must specify an id and a metadata file') return 1 id, opf = int(args[1]), open(args[2], 'rb') do_set_metadata(get_db(dbpath, opts), id, opf) From 233662ebd7872c7f2bd9b9451eb71c8e7548f73c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 21 Jun 2008 19:57:50 -0700 Subject: [PATCH 21/54] Add export command to calibredb --- src/calibre/library/cli.py | 34 ++++++++++++++++++++++++++++++++- src/calibre/library/database.py | 3 +++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index bce926ad35..6e4ceb95b8 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -362,10 +362,42 @@ show_metadata command. id, opf = int(args[1]), open(args[2], 'rb') do_set_metadata(get_db(dbpath, opts), id, opf) return 0 + +def do_export(db, ids, dir, single_dir, by_author): + if ids is None: + ids = db.all_ids() + db.export_to_dir(dir, ids, byauthor=by_author, single_dir=single_dir, index_is_id=True) + +def command_export(args, dbpath): + parser = get_parser(_('''\ +%prog export [options] ids + +Export the books specified by ids (a comma separated list) to the filesystem. +The export operation saves all formats of the book, its cover and metadata (in +an opf file). You can get id numbers from the list command. +''')) + parser.add_option('--all', default=False, action='store_true', + help=_('Export all books in database, ignoring the list of ids.')) + parser.add_option('--to-dir', default='.', + help=(_('Export books to the specified directory. Default is')+' %default')) + parser.add_option('--single-dir', default=False, action='store_true', + help=_('Export all books into a single directory')) + parser.add_option('--by-author', default=False, action='store_true', + help=_('Create file names as author - title instead of title - author')) + opts, args = parser.parse_args(sys.argv[1:]+args) + if (len(args) < 2 and not opts.all): + parser.print_help() + print + print >>sys.stderr, _('You must specify some ids or the %s option')%'--all' + return 1 + ids = None if opts.all else map(int, args[1].split(',')) + dir = os.path.abspath(os.path.expanduser(opts.to_dir)) + do_export(get_db(dbpath, opts), ids, dir, opts.single_dir, opts.by_author) + return 0 def main(args=sys.argv): commands = ('list', 'add', 'remove', 'add_format', 'remove_format', - 'show_metadata', 'set_metadata') + 'show_metadata', 'set_metadata', 'export') parser = OptionParser(_( '''\ %%prog command [options] [arguments] diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index 9d54afc88c..ceff444186 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1384,6 +1384,9 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; self.conn.execute('VACUUM;') self.conn.commit() + def all_ids(self): + return [i[0] for i in self.conn.execute('SELECT id FROM books').fetchall()] + def export_to_dir(self, dir, indices, byauthor=False, single_dir=False, index_is_id=False): if not os.path.exists(dir): From a1afe65f2cef29606b1688db5ecebf26fa9a3db2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 21 Jun 2008 20:02:11 -0700 Subject: [PATCH 22/54] New parallel processing framework. Parallel processes are controlled via TCP/IP sockets making distributed computing possible. --- osx_installer.py | 14 +- setup.py | 3 - src/calibre/__init__.py | 6 +- src/calibre/gui2/dialogs/job_view.ui | 12 +- src/calibre/gui2/jobs.py | 2 +- src/calibre/gui2/lrf_renderer/main.py | 18 +- src/calibre/gui2/main.py | 25 +- src/calibre/gui2/main_window.py | 38 ++- src/calibre/linux.py | 5 +- src/calibre/parallel.py | 452 +++++++++++++++++++------- src/calibre/terminfo.py | 4 +- upload.py | 15 +- windows_installer.py | 18 +- 13 files changed, 434 insertions(+), 178 deletions(-) diff --git a/osx_installer.py b/osx_installer.py index bd8b57a000..4c750166b2 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -48,7 +48,7 @@ def _check_symlinks_prescript(): from Authorization import Authorization, kAuthorizationFlagDestroyRights AUTHTOOL="""#!%(sp)s -import os +import os, shutil scripts = %(sp)s links = %(sp)s fonts_conf = %(sp)s @@ -64,7 +64,8 @@ if not os.path.exists('/etc/fonts/fonts.conf'): print 'Creating default fonts.conf' if not os.path.exists('/etc/fonts'): os.makedirs('/etc/fonts') - os.link(fonts_conf, '/etc/fonts/fonts.conf') + shutil.copyfile(fonts_conf, '/etc/fonts/fonts.conf') + shutil.copyfile(fonts_conf.replace('conf', 'dtd'), '/etc/fonts/fonts.dtd') """ dest_path = %(dest_path)s @@ -80,8 +81,7 @@ if not os.path.exists('/etc/fonts/fonts.conf'): continue bad = True break - if not bad: - bad = os.path.exists('/etc/fonts/fonts.conf') + bad = bad or not os.path.exists('/etc/fonts/fonts.conf') if bad: auth = Authorization(destroyflags=(kAuthorizationFlagDestroyRights,)) fd, name = tempfile.mkstemp('.py') @@ -280,13 +280,15 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), ' f.write(src) f.close() print - print 'Adding GUI main.py' + print 'Adding GUI scripts to site-packages' f = zipfile.ZipFile(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'lib', 'python2.5', 'site-packages.zip'), 'a', zipfile.ZIP_DEFLATED) - f.write('src/calibre/gui2/main.py', 'calibre/gui2/main.py') + for script in scripts['gui']: + f.write(script, script.partition('/')[-1]) f.close() print print 'Adding default fonts.conf' open(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'fonts.conf'), 'wb').write(open('/etc/fonts/fonts.conf').read()) + open(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'fonts.dtd'), 'wb').write(open('/etc/fonts/fonts.dtd').read()) print print 'Building disk image' BuildAPP.makedmg(os.path.join(self.dist_dir, APPNAME+'.app'), APPNAME+'-'+VERSION) diff --git a/setup.py b/setup.py index 7019e0179c..dcbacb47c4 100644 --- a/setup.py +++ b/setup.py @@ -13,9 +13,6 @@ print 'Setup', APPNAME, 'version:', VERSION epsrc = re.compile(r'entry_points = (\{.*?\})', re.DOTALL).search(open('src/%s/linux.py'%APPNAME, 'rb').read()).group(1) entry_points = eval(epsrc, {'__appname__': APPNAME}) -if 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower(): - entry_points['console_scripts'].append('parallel = %s.parallel:main'%APPNAME) - def _ep_to_script(ep, base='src'): return (base+os.path.sep+re.search(r'.*=\s*(.*?):', ep).group(1).replace('.', '/')+'.py').strip() diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index d70637d84f..ea23ffadb4 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -75,6 +75,8 @@ class ColoredFormatter(Formatter): def setup_cli_handlers(logger, level): + if os.environ.get('CALIBRE_WORKER', None) is not None and logger.handlers: + return logger.setLevel(level) if level == logging.WARNING: handler = logging.StreamHandler(sys.stdout) @@ -88,9 +90,7 @@ def setup_cli_handlers(logger, level): handler = logging.StreamHandler(sys.stderr) handler.setLevel(logging.DEBUG) handler.setFormatter(logging.Formatter('[%(levelname)s] %(filename)s:%(lineno)s: %(message)s')) - for hdlr in logger.handlers: - if hdlr.__class__ == handler.__class__: - logger.removeHandler(hdlr) + logger.addHandler(handler) class CustomHelpFormatter(IndentedHelpFormatter): diff --git a/src/calibre/gui2/dialogs/job_view.ui b/src/calibre/gui2/dialogs/job_view.ui index d20f67f892..f30c4fc821 100644 --- a/src/calibre/gui2/dialogs/job_view.ui +++ b/src/calibre/gui2/dialogs/job_view.ui @@ -13,13 +13,17 @@ Details of job - :/images/view.svg + + :/images/view.svg:/images/view.svg - - - QTextEdit::NoWrap + + + false + + + true diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 794a9d8f17..4a91ef0236 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -126,7 +126,7 @@ class ConversionJob(Job): def formatted_error(self): if self.exception is None: return '' - ans = u'

    %s: %s

    '%self.exception + ans = u'

    %s:'%self.exception ans += '

    Traceback:

    %s
    '%self.last_traceback return ans diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index edab6b0c1b..35c32e9226 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -1,13 +1,12 @@ from calibre.gui2.library import SearchBox __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, logging, os, traceback, time, cPickle +import sys, logging, os, traceback, time from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider -from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread, \ - QVariant +from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread -from calibre import __appname__, __version__, __author__, setup_cli_handlers, islinux, Settings +from calibre import __appname__, setup_cli_handlers, islinux, Settings from calibre.ebooks.lrf.lrfparser import LRFDocument from calibre.gui2 import ORG_NAME, APP_UID, error_dialog, choose_files, Application @@ -57,7 +56,7 @@ class Config(QDialog, Ui_ViewerConfig): class Main(MainWindow, Ui_MainWindow): def __init__(self, logger, opts, parent=None): - MainWindow.__init__(self, parent) + MainWindow.__init__(self, opts, parent) Ui_MainWindow.__init__(self) self.setupUi(self) self.setAttribute(Qt.WA_DeleteOnClose) @@ -263,9 +262,12 @@ def file_renderer(stream, opts, parent=None, logger=None): def option_parser(): - from optparse import OptionParser - parser = OptionParser(usage='%prog book.lrf', version=__appname__+' '+__version__, - epilog='Created by ' + __author__) + from calibre.gui2.main_window import option_parser + parser = option_parser('''\ +%prog [options] book.lrf + +Read the LRF ebook book.lrf +''') parser.add_option('--verbose', default=False, action='store_true', dest='verbose', help='Print more information about the rendering process') parser.add_option('--visual-debug', help='Turn on visual aids to debugging the rendering engine', diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index e856d748f0..6ba8187597 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -23,7 +23,7 @@ from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ from calibre.gui2.cover_flow import CoverFlow, DatabaseImages from calibre.library.database import LibraryDatabase from calibre.gui2.update import CheckForUpdates -from calibre.gui2.main_window import MainWindow +from calibre.gui2.main_window import MainWindow, option_parser from calibre.gui2.main_ui import Ui_MainWindow from calibre.gui2.device import DeviceDetector, DeviceManager from calibre.gui2.status import StatusBar @@ -58,8 +58,8 @@ class Main(MainWindow, Ui_MainWindow): p.end() self.default_thumbnail = (pixmap.width(), pixmap.height(), pixmap_to_data(pixmap)) - def __init__(self, single_instance, parent=None): - MainWindow.__init__(self, parent) + def __init__(self, single_instance, opts, parent=None): + MainWindow.__init__(self, opts, parent) self.single_instance = single_instance if self.single_instance is not None: self.connect(self.single_instance, SIGNAL('message_received(PyQt_PyObject)'), @@ -1079,7 +1079,7 @@ class Main(MainWindow, Ui_MainWindow): if getattr(exception, 'only_msg', False): error_dialog(self, _('Conversion Error'), unicode(exception)).exec_() return - msg = u'

    %s:

    '%exception + msg = u'

    %s:'%exception msg += u'

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

    Detailed traceback:

    '
             msg += formatted_traceback + '
    ' @@ -1166,6 +1166,13 @@ def main(args=sys.argv): pid = os.fork() if islinux else -1 if pid <= 0: + parser = option_parser('''\ +%prog [opts] [path_to_ebook] + +Launch the main calibre Graphical User Interface and optionally add the ebook at +path_to_ebook to the database. +''') + opts, args = parser.parse_args(args) app = Application(args) app.setWindowIcon(QIcon(':/library')) QCoreApplication.setOrganizationName(ORG_NAME) @@ -1173,7 +1180,7 @@ def main(args=sys.argv): single_instance = None if SingleApplication is None else SingleApplication('calibre GUI') if not singleinstance('calibre GUI'): if single_instance is not None and single_instance.is_running() and \ - single_instance.send_message('launched:'+repr(sys.argv)): + single_instance.send_message('launched:'+repr(args)): return 0 QMessageBox.critical(None, 'Cannot Start '+__appname__, @@ -1181,14 +1188,14 @@ def main(args=sys.argv): return 1 initialize_file_icon_provider() try: - main = Main(single_instance) + main = Main(single_instance, opts) except DatabaseLocked, err: QMessageBox.critical(None, 'Cannot Start '+__appname__, '

    Another program is using the database.
    Perhaps %s is already running?
    If not try deleting the file %s'%(__appname__, err.lock_file_path)) return 1 sys.excepthook = main.unhandled_exception - if len(sys.argv) > 1: - main.add_filesystem_book(sys.argv[1]) + if len(args) > 1: + main.add_filesystem_book(args) return app.exec_() return 0 @@ -1199,7 +1206,7 @@ if __name__ == '__main__': except: if not iswindows: raise from PyQt4.QtGui import QErrorMessage - logfile = os.path.expanduser('~/calibre.log') + logfile = os.path.join(os.path.expanduser('~'), 'calibre.log') if os.path.exists(logfile): log = open(logfile).read() if log.strip(): diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index c2b5efc0ed..66987228d1 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -3,13 +3,45 @@ __copyright__ = '2008, Kovid Goyal ' import StringIO, traceback, sys -from PyQt4.QtGui import QMainWindow +from PyQt4.Qt import QMainWindow, QString, Qt, QFont from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog +from calibre import OptionParser + +def option_parser(usage='''\ +Usage: %prog [options] + +Launch the Graphical User Interface +'''): + parser = OptionParser(usage) + parser.add_option('--redirect-console-output', default=False, action='store_true', dest='redirect', + help=_('Redirect console output to a dialog window (both stdout and stderr). Useful on windows where GUI apps do not have a output streams.')) + return parser + +class DebugWindow(ConversionErrorDialog): + + def __init__(self, parent): + ConversionErrorDialog.__init__(self, parent, 'Console output', '') + self.setModal(Qt.NonModal) + font = QFont() + font.setStyleHint(QFont.TypeWriter) + self.text.setFont(font) + + def write(self, msg): + self.text.setPlainText(self.text.toPlainText()+QString(msg)) + + def flush(self): + pass class MainWindow(QMainWindow): - def __init__(self, parent=None): + def __init__(self, opts, parent=None): QMainWindow.__init__(self, parent) + if opts.redirect: + self.__console_redirect = DebugWindow(self) + sys.stdout = sys.stderr = self.__console_redirect + self.__console_redirect.show() + print 'testing 1' + print 'testing 2' def unhandled_exception(self, type, value, tb): try: @@ -19,7 +51,7 @@ class MainWindow(QMainWindow): print >>sys.stderr, fe msg = '

    ' + unicode(str(value), 'utf8', 'replace') + '

    ' msg += '

    Detailed traceback:

    '+fe+'
    ' - d = ConversionErrorDialog(self, 'ERROR: Unhandled exception', msg) + d = ConversionErrorDialog(self, _('ERROR: Unhandled exception'), msg) d.exec_() except: pass \ No newline at end of file diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 3bc5cd9467..fc35a54b78 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -46,9 +46,10 @@ entry_points = { 'librarything = calibre.ebooks.metadata.library_thing:main', 'mobi2oeb = calibre.ebooks.mobi.reader:main', 'lrf2html = calibre.ebooks.lrf.html.convert_to:main', - 'calibre-debug = calibre.debug:main', - 'calibredb = calibre.library.cli:main', + 'calibre-debug = calibre.debug:main', + 'calibredb = calibre.library.cli:main', 'calibre-fontconfig = calibre.utils.fontconfig:main', + 'calibre-parallel = calibre.parallel:main', ], 'gui_scripts' : [ __appname__+' = calibre.gui2.main:main', diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 7c0c997def..51a9cf97b8 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -1,75 +1,231 @@ from __future__ import with_statement __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + ''' -Used to run jobs in parallel in separate processes. +Used to run jobs in parallel in separate processes. Features output streaming, +support for progress notification as well as job killing. The worker processes +are controlled via a simple protocol run over TCP/IP sockets. The control happens +mainly in two class, :class:`Server` and :class:`Overseer`. The worker is +encapsulated in the function :function:`worker`. Every worker process +has the environment variable :envvar:`CALIBRE_WORKER` defined. + +The worker control protocol has two modes of operation. In the first mode, the +worker process listens for commands from the controller process. The controller +process can either hand off a job to the worker or tell the worker to die. +Once a job is handed off to the worker, the protocol enters the second mode, where +the controller listens for messages from the worker. The worker can send progress updates +as well as console output (i.e. text that would normally have been written to stdout +or stderr by the job). Once the job completes (or raises an exception) the worker +returns the result (or exception) to the controller adnt he protocol reverts to the first mode. + +In the second mode, the controller can also send the worker STOP messages, in which case +the worker interrupts the job and dies. The sending of progress and console output messages +is buffered and asynchronous to prevent the job from being IO bound. ''' -import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, \ - subprocess, socket, collections, binascii +import sys, os, gc, cPickle, traceback, atexit, cStringIO, time, signal, \ + subprocess, socket, collections, binascii, re, tempfile, thread from select import select from functools import partial from threading import RLock, Thread, Event -from calibre.ebooks.lrf.any.convert_from import main as any2lrf -from calibre.ebooks.lrf.web.convert_from import main as web2lrf -from calibre.ebooks.lrf.feeds.convert_from import main as feeds2lrf -from calibre.gui2.lrf_renderer.main import main as lrfviewer from calibre.ptempfile import PersistentTemporaryFile +from calibre import iswindows, detect_ncpus, isosx -try: - from calibre.ebooks.lrf.html.table_as_image import do_render as render_table -except: # Dont fail is PyQt4.4 not present - render_table = None -from calibre import iswindows, islinux, detect_ncpus - -sa = None -job_id = None - -def report_progress(percent, msg=''): - if sa is not None and job_id is not None: - msg = 'progress:%s:%f:%s'%(job_id, percent, msg) - sa.send_message(msg) - -_notify = 'fskjhwseiuyweoiu987435935-0342' +#: A mapping from job names to functions that perform the jobs PARALLEL_FUNCS = { - 'any2lrf' : partial(any2lrf, gui_mode=True), - 'web2lrf' : web2lrf, - 'lrfviewer' : lrfviewer, - 'feeds2lrf' : partial(feeds2lrf, notification=_notify), - 'render_table': render_table, - } + 'any2lrf' : + ('calibre.ebooks.lrf.any.convert_from', 'main', dict(gui_mode=True), None), + + 'lrfviewer' : + ('calibre.gui2.lrf_renderer.main', 'main', {}, None), + + 'feeds2lrf' : + ('calibre.ebooks.lrf.feeds.convert_from', 'main', {}, 'notification'), + + 'render_table' : + ('calibre.ebooks.lrf.html.table_as_image', 'do_render', {}, None), +} -python = sys.executable -popen = subprocess.Popen -if iswindows: - if hasattr(sys, 'frozen'): - python = os.path.join(os.path.dirname(python), 'parallel.exe') - else: - python = os.path.join(os.path.dirname(python), 'Scripts\\parallel.exe') - open = partial(subprocess.Popen, creationflags=0x08) # CREATE_NO_WINDOW=0x08 so that no ugly console is popped up +isfrozen = hasattr(sys, 'frozen') -if islinux and hasattr(sys, 'frozen_path'): - python = os.path.join(getattr(sys, 'frozen_path'), 'calibre-parallel') - popen = partial(subprocess.Popen, cwd=getattr(sys, 'frozen_path')) +win32event = __import__('win32event') if iswindows else None +win32process = __import__('win32process') if iswindows else None +msvcrt = __import__('msvcrt') if iswindows else None -prefix = 'import sys; sys.in_worker = True; ' -if hasattr(sys, 'frameworks_dir'): - fd = getattr(sys, 'frameworks_dir') - prefix += 'sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd - if fd not in os.environ['PATH']: - os.environ['PATH'] += ':'+fd -if 'parallel' in python: - executable = [python] - worker_command = '%s:%s' - free_spirit_command = '%s' -else: - executable = [python, '-c'] - worker_command = prefix + 'from calibre.parallel import worker; worker(%s, %s)' - free_spirit_command = prefix + 'from calibre.parallel import free_spirit; free_spirit(%s)' +class WorkerStatus(object): + ''' + A platform independent class to control child processes. Provides the + methods: + + .. method:: WorkerStatus.is_alive() + + Return True is the child process is alive (i.e. it hasn't exited and returned a return code). + + .. method:: WorkerStatus.returncode() + + Wait for the child process to exit and return its return code (blocks until child returns). + + .. method:: WorkerStatus.kill() + + Forcibly terminates child process using operating system specific semantics. + ''' + + def __init__(self, obj): + ''' + `obj`: On windows a process handle, on unix a subprocess.Popen object. + ''' + self.obj = obj + self.win32process = win32process # Needed if kill is called during shutdown of interpreter + self.os = os + self.signal = signal + ext = 'windows' if iswindows else 'unix' + for func in ('is_alive', 'returncode', 'kill'): + setattr(self, func, getattr(self, func+'_'+ext)) + + def is_alive_unix(self): + return self.obj.poll() == None + + def returncode_unix(self): + return self.obj.wait() + + def kill_unix(self): + os.kill(self.obj.pid, self.signal.SIGKILL) + + def is_alive_windows(self): + return win32event.WaitForSingleObject(self.obj, 0) != win32event.WAIT_OBJECT_0 + + def returncode_windows(self): + return win32process.GetExitCodeProcess(self.obj) + + def kill_windows(self, returncode=-1): + self.win32process.TerminateProcess(self.obj, returncode) + +class WorkerMother(object): + ''' + Platform independent object for launching child processes. All processes + have the environment variable :envvar:`CALIBRE_WORKER` set. + + ..method:: WorkerMother.spawn_free_spirit(arg) + + Launch a non monitored process with argument `arg`. + + ..method:: WorkerMother.spawn_worker(arg) + + Launch a monitored and controllable process with argument `arg`. + ''' + + def __init__(self): + ext = 'windows' if iswindows else 'osx' if isosx else 'linux' + self.os = os # Needed incase cleanup called when interpreter is shutting down + if iswindows: + self.executable = os.path.join(os.path.dirname(sys.executable), + 'calibre-parallel.exe' if isfrozen else 'Scripts\\calibre-parallel.exe') + elif isosx: + self.executable = sys.executable + self.prefix = '' + if isfrozen: + fd = getattr(sys, 'frameworks_dir') + contents = os.path.dirname(fd) + resources = os.path.join(contents, 'Resources') + sp = os.path.join(resources, 'lib', 'python'+sys.version[:3], 'site-packages.zip') + + self.prefix += 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd + self.prefix += 'sys.path.insert(0, %s); '%repr(sp) + self.env = {} + if fd not in os.environ['PATH']: + self.env['PATH'] = os.environ['PATH']+':'+fd + self.env['PYTHONHOME'] = resources + else: + self.executable = os.path.join(getattr(sys, 'frozen_path'), 'calibre-parallel') \ + if isfrozen else 'calibre-parallel' + + self.spawn_worker_windows = lambda arg : self.spawn_free_spirit_windows(arg, type='worker') + self.spawn_worker_linux = lambda arg : self.spawn_free_spirit_linux(arg, type='worker') + self.spawn_worker_osx = lambda arg : self.spawn_free_spirit_osx(arg, type='worker') + + for func in ('spawn_free_spirit', 'spawn_worker'): + setattr(self, func, getattr(self, func+'_'+ext)) + + + def cleanup_child_windows(self, child, name=None, fd=None): + try: + child.kill() + except: + pass + try: + if fd is not None: + self.os.close(fd) + except: + pass + try: + if name is not None and os.path.exists(name): + self.os.unlink(name) + except: + pass + + def cleanup_child_linux(self, child): + try: + child.kill() + except: + pass + + def get_env(self): + env = dict(os.environ) + env['CALIBRE_WORKER'] = '1' + if hasattr(self, 'env'): + env.update(self.env) + return env + + def spawn_free_spirit_osx(self, arg, type='free_spirit'): + script = 'from calibre.parallel import main; main(args=["calibre-parallel", %s]);'%repr(arg) + cmdline = [self.executable, '-c', self.prefix+script] + child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env())) + atexit.register(self.cleanup_child_linux, child) + return child + + def spawn_free_spirit_linux(self, arg, type='free_spirit'): + cmdline = [self.executable, arg] + child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env())) + atexit.register(self.cleanup_child_linux, child) + return child + + def spawn_free_spirit_windows(self, arg, type='free_spirit'): + fd, name = tempfile.mkstemp('.log', 'calibre_'+type+'_') + handle = msvcrt.get_osfhandle(fd) + si = win32process.STARTUPINFO() + si.hStdOutput = handle + si.hStdError = handle + cmdline = self.executable + ' ' + str(arg) + hProcess = \ + win32process.CreateProcess( + None, # Application Name + cmdline, # Command line + None, # processAttributes + None, # threadAttributes + 1, # bInheritHandles + win32process.CREATE_NO_WINDOW, # Dont want ugly console popping up + self.get_env(), # New environment + None, # Current directory + si + )[0] + child = WorkerStatus(hProcess) + atexit.register(self.cleanup_child_windows, child, name, fd) + return child + + +mother = WorkerMother() def write(socket, msg, timeout=5): + ''' + Write a message on socket. If `msg` is unicode, it is encoded in utf-8. + Raises a `RuntimeError` if the socket is not ready for writing or the writing fails. + `msg` is broken into chunks of size 4096 and sent. The :function:`read` function + automatically re-assembles the chunks into whole message. + ''' if isinstance(msg, unicode): msg = msg.encode('utf-8') length = None @@ -88,6 +244,11 @@ def write(socket, msg, timeout=5): def read(socket, timeout=5): + ''' + Read a message from `socket`. The message must have been sent with the :function:`write` + function. Raises a `RuntimeError` if the message is corrpted. Can return an + empty string. + ''' buf = cStringIO.StringIO() length = None while select([socket],[],[],timeout)[0]: @@ -108,6 +269,11 @@ def read(socket, timeout=5): return msg class RepeatingTimer(Thread): + ''' + Calls a specified function repeatedly at a specified interval. Runs in a + daemon thread (i.e. the interpreter can exit while it is still running). + Call :meth:`start()` to start it. + ''' def repeat(self): while True: @@ -116,25 +282,31 @@ class RepeatingTimer(Thread): break self.action() - def __init__(self, interval, func): + def __init__(self, interval, func, name): self.event = Event() self.interval = interval self.action = func - Thread.__init__(self, target=self.repeat) + Thread.__init__(self, target=self.repeat, name=name) self.setDaemon(True) class ControlError(Exception): pass class Overseer(object): + ''' + Responsible for controlling worker processes. The main interface is the + methods, :meth:`initialize_job`, :meth:`control`. + ''' KILL_RESULT = 'Server: job killed by user|||#@#$%&*)*(*$#$%#$@&' INTERVAL = 0.1 def __init__(self, server, port, timeout=5): - self.cmd = worker_command%(repr('127.0.0.1'), repr(port)) - self.process = popen(executable + [self.cmd]) + self.worker_status = mother.spawn_worker('127.0.0.1:%d'%port) self.socket = server.accept()[0] + # Needed if terminate called hwen interpreter is shutting down + self.os = os + self.signal = signal self.working = False self.timeout = timeout @@ -152,9 +324,7 @@ class Overseer(object): raise RuntimeError('Worker sulking') def terminate(self): - ''' - Kill process. - ''' + 'Kill worker process.' try: if self.socket: self.write('STOP:') @@ -170,9 +340,8 @@ class Overseer(object): except: pass else: - import signal try: - os.kill(self.worker_pid, signal.SIGKILL) + self.os.kill(self.worker_pid, self.signal.SIGKILL) time.sleep(0.05) except: pass @@ -188,16 +357,19 @@ class Overseer(object): return hasattr(other, 'process') and hasattr(other, 'worker_pid') and self.worker_pid == other.worker_pid def __bool__(self): - self.process.poll() - return self.process.returncode is None - - def pid(self): - return self.worker_pid + return self.worker_status.is_alive() def select(self, timeout=0): return select([self.socket], [self.socket], [self.socket], timeout) def initialize_job(self, job): + ''' + Sends `job` to worker process. Can raise `ControlError` if worker process + does not respond appropriately. In this case, this Overseer is useless + and should be discarded. + + `job`: An instance of :class:`Job`. + ''' self.job_id = job.job_id self.working = True self.write('JOB:'+cPickle.dumps((job.func, job.args, job.kwdargs), -1)) @@ -209,40 +381,44 @@ class Overseer(object): self.job = job def control(self): - try: - if select([self.socket],[],[],0)[0]: - msg = self.read() - word, msg = msg.partition(':')[0], msg.partition(':')[-1] - if word == 'RESULT': - self.write('OK') - return Result(cPickle.loads(msg), None, None) - elif word == 'OUTPUT': - self.write('OK') - try: - self.output(''.join(cPickle.loads(msg))) - except: - self.output('Bad output message: '+ repr(msg)) - elif word == 'PROGRESS': - self.write('OK') - percent = None - try: - percent, msg = cPickle.loads(msg)[-1] - except: - print 'Bad progress update:', repr(msg) - if self.progress and percent is not None: - self.progress(percent, msg) - elif word == 'ERROR': - self.write('OK') - return Result(None, *cPickle.loads(msg)) - else: - self.terminate() - return Result(None, ControlError('Worker sent invalid msg: %s', repr(msg)), '') - self.process.poll() - if self.process.returncode is not None: - return Result(None, ControlError('Worker process died unexpectedly with returncode: %d'%self.process.returncode), '') - finally: - self.working = False - self.last_job_time = time.time() + ''' + Listens for messages from the worker process and dispatches them + appropriately. If the worker process dies unexpectedly, returns a result + of None with a ControlError indicating the worker died. + + Returns a :class:`Result` instance or None, if the worker is still working. + ''' + if select([self.socket],[],[],0)[0]: + msg = self.read() + word, msg = msg.partition(':')[0], msg.partition(':')[-1] + if word == 'RESULT': + self.write('OK') + return Result(cPickle.loads(msg), None, None) + elif word == 'OUTPUT': + self.write('OK') + try: + self.output(''.join(cPickle.loads(msg))) + except: + self.output('Bad output message: '+ repr(msg)) + elif word == 'PROGRESS': + self.write('OK') + percent = None + try: + percent, msg = cPickle.loads(msg)[-1] + except: + print 'Bad progress update:', repr(msg) + if self.progress and percent is not None: + self.progress(percent, msg) + elif word == 'ERROR': + self.write('OK') + return Result(None, *cPickle.loads(msg)) + else: + self.terminate() + return Result(None, ControlError('Worker sent invalid msg: %s', repr(msg)), '') + if not self.worker_status.is_alive(): + return Result(None, ControlError('Worker process died unexpectedly with returncode: %d'%self.process.returncode), '') + + class Job(object): @@ -325,14 +501,23 @@ class Server(Thread): if len(self.jobs) > 0 and len(self.working) < self.number_of_workers: job = self.jobs.popleft() with self.pool_lock: - o = self.pool.pop() if self.pool else Overseer(self.server_socket, self.port) - try: - o.initialize_job(job) - except Exception, err: - res = Result(None, unicode(err), traceback.format_exc()) - job.done(res) - o.terminate() o = None + while self.pool: + o = self.pool.pop() + try: + o.initialize_job(job) + break + except: + o.terminate() + if o is None: + o = Overseer(self.server_socket, self.port) + try: + o.initialize_job(job) + except Exception, err: + o.terminate() + res = Result(None, unicode(err), traceback.format_exc()) + job.done(res) + o = None if o: with self.working_lock: self.working.append(o) @@ -393,8 +578,8 @@ class Server(Thread): pt = PersistentTemporaryFile('.pickle', '_IPC_') pt.write(cPickle.dumps((func, args, kwdargs))) pt.close() - cmd = free_spirit_command%repr(binascii.hexlify(pt.name)) - popen(executable + [cmd]) + mother.spawn_free_spirit(binascii.hexlify(pt.name)) + ########################################################################################## ##################################### CLIENT CODE ##################################### @@ -406,8 +591,7 @@ class BufferedSender(object): self.socket = socket self.wbuf, self.pbuf = [], [] self.wlock, self.plock = RLock(), RLock() - self.timer = RepeatingTimer(0.5, self.send) - self.prefix = prefix + self.timer = RepeatingTimer(0.5, self.send, 'BufferedSender') self.timer.start() def write(self, msg): @@ -417,6 +601,15 @@ class BufferedSender(object): self.wbuf.append(msg) def send(self): + if select([self.socket], [], [], 0)[0]: + msg = read(self.socket) + if msg == 'PING:': + write(self.socket, 'OK') + elif msg: + self.socket.shutdown(socket.SHUT_RDWR) + thread.interrupt_main() + time.sleep(1) + raise SystemExit if not select([], [self.socket], [], 30)[1]: print >>sys.__stderr__, 'Cannot pipe to overseer' return @@ -442,13 +635,18 @@ class BufferedSender(object): def flush(self): pass +def get_func(name): + module, func, kwdargs, notification = PARALLEL_FUNCS[name] + module = __import__(module, fromlist=[1]) + func = getattr(module, func) + return func, kwdargs, notification + def work(client_socket, func, args, kwdargs): - func = PARALLEL_FUNCS[func] - if hasattr(func, 'keywords'): - for key, val in func.keywords.items(): - if val == _notify and hasattr(sys.stdout, 'notify'): - func.keywords[key] = sys.stdout.notify - res = func(*args, **kwdargs) + func, kargs, notification = get_func(func) + if notification is not None and hasattr(sys.stdout, 'notify'): + kargs[notification] = sys.stdout.notify + kargs.update(kwdargs) + res = func(*args, **kargs) if hasattr(sys.stdout, 'send'): sys.stdout.send() return res @@ -467,6 +665,9 @@ def worker(host, port): sys.stderr = sys.stdout while True: + if not select([client_socket], [], [], 60)[0]: + time.sleep(1) + continue msg = read(client_socket, timeout=60) if msg.startswith('JOB:'): func, args, kwdargs = cPickle.loads(msg[4:]) @@ -481,7 +682,10 @@ def worker(host, port): if read(client_socket, 10) != 'OK': break gc.collect() + elif msg == 'PING:': + write(client_socket, 'OK') elif msg == 'STOP:': + client_socket.shutdown(socket.SHUT_RDWR) return 0 elif not msg: time.sleep(1) @@ -490,21 +694,23 @@ def worker(host, port): return 1 def free_spirit(path): - func, args, kwdargs = cPickle.load(open(binascii.unhexlify(path), 'rb')) + func, args, kwdargs = cPickle.load(open(path, 'rb')) try: os.unlink(path) except: pass - PARALLEL_FUNCS[func](*args, **kwdargs) + func, kargs = get_func(func)[:2] + kargs.update(kwdargs) + func(*args, **kargs) def main(args=sys.argv): args = args[1].split(':') if len(args) == 1: - free_spirit(args[0].replace("'", '')) + free_spirit(binascii.unhexlify(re.sub(r'[^a-f0-9A-F]', '', args[0]))) else: worker(args[0].replace("'", ''), int(args[1])) return 0 if __name__ == '__main__': sys.exit(main()) - \ No newline at end of file + diff --git a/src/calibre/terminfo.py b/src/calibre/terminfo.py index 2ed03a3077..121f5fcfd1 100644 --- a/src/calibre/terminfo.py +++ b/src/calibre/terminfo.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, re +import sys, re, os """ Get information about the terminal we are running in """ @@ -94,7 +94,7 @@ class TerminalController: except: return # If the stream isn't a tty, then assume it has no capabilities. - if hasattr(sys, 'in_worker') or not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return + if os.environ.get('CALIBRE_WORKER', None) is not None or not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return # Check the terminal type. If we fail, then assume that the # terminal has no capabilities. diff --git a/upload.py b/upload.py index 8ec158c1db..da2bd790dd 100644 --- a/upload.py +++ b/upload.py @@ -63,17 +63,18 @@ def start_vm(vm, ssh_host, build_script, sleep=75): subprocess.check_call(('scp', t.name, ssh_host+':build-'+PROJECT)) subprocess.check_call('ssh -t %s bash build-%s'%(ssh_host, PROJECT), shell=True) -def build_windows(): +def build_windows(shutdown=True): installer = installer_name('exe') vm = '/vmware/Windows XP/Windows XP Professional.vmx' start_vm(vm, 'windows', BUILD_SCRIPT%('python setup.py develop', 'python','windows_installer.py')) subprocess.check_call(('scp', 'windows:build/%s/dist/*.exe'%PROJECT, 'dist')) if not os.path.exists(installer): raise Exception('Failed to build installer '+installer) - subprocess.Popen(('ssh', 'windows', 'shutdown', '-s', '-t', '0')) + if shutdown: + subprocess.Popen(('ssh', 'windows', 'shutdown', '-s', '-t', '0')) return os.path.basename(installer) -def build_osx(): +def build_osx(shutdown=True): installer = installer_name('dmg') vm = '/vmware/Mac OSX/Mac OSX.vmx' python = '/Library/Frameworks/Python.framework/Versions/Current/bin/python' @@ -81,18 +82,20 @@ def build_osx(): subprocess.check_call(('scp', 'osx:build/%s/dist/*.dmg'%PROJECT, 'dist')) if not os.path.exists(installer): raise Exception('Failed to build installer '+installer) - subprocess.Popen(('ssh', 'osx', 'sudo', '/sbin/shutdown', '-h', 'now')) + if shutdown: + subprocess.Popen(('ssh', 'osx', 'sudo', '/sbin/shutdown', '-h', 'now')) return os.path.basename(installer) -def build_linux(): +def build_linux(shutdown=True): installer = installer_name('tar.bz2') vm = '/vmware/linux/libprs500-gentoo.vmx' start_vm(vm, 'linux', BUILD_SCRIPT%('sudo python setup.py develop', 'python','linux_installer.py')) subprocess.check_call(('scp', 'linux:/tmp/%s'%os.path.basename(installer), 'dist')) if not os.path.exists(installer): raise Exception('Failed to build installer '+installer) - subprocess.Popen(('ssh', 'linux', 'sudo', '/sbin/poweroff')) + if shutdown: + subprocess.Popen(('ssh', 'linux', 'sudo', '/sbin/poweroff')) return os.path.basename(installer) def build_installers(): diff --git a/windows_installer.py b/windows_installer.py index afabe531f8..38d90f42f4 100644 --- a/windows_installer.py +++ b/windows_installer.py @@ -412,7 +412,7 @@ SectionEnd version=VERSION, outpath=os.path.abspath(output_dir)) - def build(self): + def build(self): f = open('installer.nsi', 'w') path = f.name f.write(self.installer) @@ -420,7 +420,7 @@ SectionEnd try: subprocess.check_call('"C:\Program Files\NSIS\makensis.exe" /V2 ' + path, shell=True) except: - print path + print path else: os.remove(path) @@ -537,18 +537,18 @@ class BuildEXE(build_exe): def main(): sys.argv[1:2] = ['py2exe'] - console = [dict(dest_base=basenames['console'][i], script=scripts['console'][i]) - for i in range(len(scripts['console']))] + console = [dict(dest_base=basenames['console'][i], script=scripts['console'][i]) + for i in range(len(scripts['console']))]# if not 'parallel.py' in scripts['console'][i] ] sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) setup( cmdclass = {'py2exe': BuildEXE}, windows = [ - {'script' : scripts['gui'][0], + {'script' : scripts['gui'][0], 'dest_base' : APPNAME, 'icon_resources' : [(1, 'icons/library.ico')], 'other_resources' : [BuildEXE.manifest(APPNAME)], }, - {'script' : scripts['gui'][1], + {'script' : scripts['gui'][1], 'dest_base' : 'lrfviewer', 'icon_resources' : [(1, 'icons/viewer.ico')], 'other_resources' : [BuildEXE.manifest('lrfviewer')], @@ -561,11 +561,13 @@ def main(): 'includes' : [ 'sip', 'pkg_resources', 'PyQt4.QtSvg', 'mechanize', 'ClientForm', 'wmi', - 'win32file', 'pythoncom', 'rtf2xml', + 'win32file', 'pythoncom', 'rtf2xml', + 'win32process', 'win32api', 'msvcrt', + 'win32event', 'lxml', 'lxml._elementpath', 'genshi', 'path', 'pydoc', 'IPython.Extensions.*', 'calibre.web.feeds.recipes.*', 'PyQt4.QtWebKit', - ], + ], 'packages' : ['PIL'], 'excludes' : ["Tkconstants", "Tkinter", "tcl", "_imagingtk", "ImageTk", "FixTk" From 06096f8a7d7eaa1a20752c8dca849f97dbce6e02 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 22 Jun 2008 00:33:58 -0700 Subject: [PATCH 23/54] version 0.4.73 --- osx_installer.py | 9 +++++---- src/calibre/__init__.py | 2 +- src/calibre/gui2/main.py | 5 ++++- windows_installer.py | 14 ++++++++------ 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/osx_installer.py b/osx_installer.py index 4c750166b2..afe9f6fde0 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -280,9 +280,9 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), ' f.write(src) f.close() print - print 'Adding GUI scripts to site-packages' + print 'Adding main scripts to site-packages' f = zipfile.ZipFile(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'lib', 'python2.5', 'site-packages.zip'), 'a', zipfile.ZIP_DEFLATED) - for script in scripts['gui']: + for script in scripts['gui']+scripts['console']: f.write(script, script.partition('/')[-1]) f.close() print @@ -307,10 +307,11 @@ def main(): 'argv_emulation' : True, 'iconfile' : 'icons/library.icns', 'frameworks': ['libusb.dylib', 'libunrar.dylib'], - 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', + 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', 'PyQt4.QtSvg', 'PyQt4.QtWebKit', - 'mechanize', 'ClientForm', 'usbobserver', + 'mechanize', 'ClientForm', 'usbobserver', 'genshi', 'calibre.web.feeds.recipes.*', + 'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*', 'keyword', 'codeop', 'pydoc'], 'packages' : ['PIL', 'Authorization', 'rtf2xml', 'lxml'], 'excludes' : ['IPython'], diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index ea23ffadb4..050ae5d89c 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.72' +__version__ = '0.4.73' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 6ba8187597..d0260d7ad5 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1079,7 +1079,10 @@ class Main(MainWindow, Ui_MainWindow): if getattr(exception, 'only_msg', False): error_dialog(self, _('Conversion Error'), unicode(exception)).exec_() return - msg = u'

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

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

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

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

    Detailed traceback:

    '
             msg += formatted_traceback + '
    ' diff --git a/windows_installer.py b/windows_installer.py index 38d90f42f4..cd88444f04 100644 --- a/windows_installer.py +++ b/windows_installer.py @@ -509,9 +509,10 @@ class BuildEXE(build_exe): shutil.copytree(imfd, tg) print - print 'Adding GUI main.py' + print 'Adding main scripts' f = zipfile.ZipFile(os.path.join('build', 'py2exe', 'library.zip'), 'a', zipfile.ZIP_DEFLATED) - f.write('src\\calibre\\gui2\\main.py', 'calibre\\gui2\\main.py') + for i in scripts['console'] + scripts['gui']: + f.write(i, i.partition('\\')[-1]) f.close() print @@ -559,17 +560,18 @@ def main(): 'optimize' : 2, 'dist_dir' : PY2EXE_DIR, 'includes' : [ - 'sip', 'pkg_resources', 'PyQt4.QtSvg', - 'mechanize', 'ClientForm', 'wmi', + 'sip', 'pkg_resources', 'PyQt4.QtSvg', + 'mechanize', 'ClientForm', 'wmi', 'win32file', 'pythoncom', 'rtf2xml', 'win32process', 'win32api', 'msvcrt', - 'win32event', + 'win32event', 'calibre.ebooks.lrf.any.*', + 'calibre.ebooks.lrf.feeds.*', 'lxml', 'lxml._elementpath', 'genshi', 'path', 'pydoc', 'IPython.Extensions.*', 'calibre.web.feeds.recipes.*', 'PyQt4.QtWebKit', ], 'packages' : ['PIL'], - 'excludes' : ["Tkconstants", "Tkinter", "tcl", + 'excludes' : ["Tkconstants", "Tkinter", "tcl", "_imagingtk", "ImageTk", "FixTk" ], 'dll_excludes' : ['mswsock.dll'], From 564136084a0ae1b09c73328ef7f267cd6900c0d3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 22 Jun 2008 00:36:07 -0700 Subject: [PATCH 24/54] IGN:Tag release From b54dd3c0594ca8cbefdf0c56cbef95bcb1eb7bf1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 22 Jun 2008 14:53:20 -0700 Subject: [PATCH 25/54] IGN:Fix fontconfig on OSX and other minor fixes --- osx_installer.py | 32 +++++++-------- src/calibre/gui2/lrf_renderer/main.py | 3 +- .../gui2/pictureflow/PyQt/configure.py | 1 + src/calibre/parallel.py | 5 ++- src/calibre/utils/fontconfig.py | 41 ++++++++++++++----- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/osx_installer.py b/osx_installer.py index afe9f6fde0..c092650de6 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -39,6 +39,7 @@ print >>loader, '%(function)s()' loader.close() os.chmod(loader_path, 0700) os.environ['PYTHONHOME'] = resources_dir +os.environ['FC_CONFIG_DIR'] = os.path.join(resources_dir, 'fonts') os.execv(loader_path, sys.argv) ''' CHECK_SYMLINKS_PRESCRIPT = \ @@ -48,10 +49,9 @@ def _check_symlinks_prescript(): from Authorization import Authorization, kAuthorizationFlagDestroyRights AUTHTOOL="""#!%(sp)s -import os, shutil +import os scripts = %(sp)s links = %(sp)s -fonts_conf = %(sp)s os.setuid(0) for s, l in zip(scripts, links): if os.path.lexists(l): @@ -60,12 +60,6 @@ for s, l in zip(scripts, links): omask = os.umask(022) os.symlink(s, l) os.umask(omask) -if not os.path.exists('/etc/fonts/fonts.conf'): - print 'Creating default fonts.conf' - if not os.path.exists('/etc/fonts'): - os.makedirs('/etc/fonts') - shutil.copyfile(fonts_conf, '/etc/fonts/fonts.conf') - shutil.copyfile(fonts_conf.replace('conf', 'dtd'), '/etc/fonts/fonts.dtd') """ dest_path = %(dest_path)s @@ -73,7 +67,6 @@ if not os.path.exists('/etc/fonts/fonts.conf'): scripts = %(scripts)s links = [os.path.join(dest_path, i) for i in scripts] scripts = [os.path.join(resources_path, 'loaders', i) for i in scripts] - fonts_conf = os.path.join(resources_path, 'fonts.conf') bad = False for s, l in zip(scripts, links): @@ -81,11 +74,10 @@ if not os.path.exists('/etc/fonts/fonts.conf'): continue bad = True break - bad = bad or not os.path.exists('/etc/fonts/fonts.conf') if bad: auth = Authorization(destroyflags=(kAuthorizationFlagDestroyRights,)) fd, name = tempfile.mkstemp('.py') - os.write(fd, AUTHTOOL %(pp)s (sys.executable, repr(scripts), repr(links), repr(fonts_conf))) + os.write(fd, AUTHTOOL %(pp)s (sys.executable, repr(scripts), repr(links))) os.close(fd) os.chmod(name, 0700) try: @@ -249,13 +241,18 @@ _check_symlinks_prescript() print 'Adding plugins' module_dir = os.path.join(resource_dir, 'lib', 'python2.5', 'lib-dynload') print 'Adding fontconfig' - for f in glob.glob(os.path.expanduser('~/fontconfig/*')): + for f in glob.glob(os.path.expanduser('~/fontconfig2/*')): os.link(f, os.path.join(frameworks_dir, os.path.basename(f))) for src, dest in plugin_files: if 'dylib' in dest: os.link(src, os.path.join(frameworks_dir, dest)) else: os.link(src, os.path.join(module_dir, dest)) + dst = os.path.join(resource_dir, 'fonts') + if os.path.exists(dst): + shutil.rmtree(dst) + shutil.copytree('/usr/local/etc/fonts', dst, symlinks=False) + print print 'Adding IPython' dst = os.path.join(resource_dir, 'lib', 'python2.5', 'IPython') @@ -286,10 +283,6 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), ' f.write(script, script.partition('/')[-1]) f.close() print - print 'Adding default fonts.conf' - open(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'fonts.conf'), 'wb').write(open('/etc/fonts/fonts.conf').read()) - open(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'fonts.dtd'), 'wb').write(open('/etc/fonts/fonts.dtd').read()) - print print 'Building disk image' BuildAPP.makedmg(os.path.join(self.dist_dir, APPNAME+'.app'), APPNAME+'-'+VERSION) @@ -312,7 +305,7 @@ def main(): 'mechanize', 'ClientForm', 'usbobserver', 'genshi', 'calibre.web.feeds.recipes.*', 'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*', - 'keyword', 'codeop', 'pydoc'], + 'keyword', 'codeop', 'pydoc', 'readline'], 'packages' : ['PIL', 'Authorization', 'rtf2xml', 'lxml'], 'excludes' : ['IPython'], 'plist' : { 'CFBundleGetInfoString' : '''calibre, an E-book management application.''' @@ -322,7 +315,10 @@ def main(): 'CFBundleVersion':APPNAME + ' ' + VERSION, 'LSMinimumSystemVersion':'10.4.3', 'LSMultipleInstancesProhibited':'true', - 'NSHumanReadableCopyright':'Copyright 2006, Kovid Goyal', + 'NSHumanReadableCopyright':'Copyright 2008, Kovid Goyal', + 'LSEnvironment':{ + 'FC_CONFIG_DIR':'@executable_path/../Resources/fonts', + } }, }, }, diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 35c32e9226..6dd5722bd9 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import sys, logging, os, traceback, time -from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider +from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread from calibre import __appname__, setup_cli_handlers, islinux, Settings @@ -300,6 +300,7 @@ def main(args=sys.argv, logger=None): pid = os.fork() if islinux else -1 if pid <= 0: app = Application(args) + app.setWindowIcon(QIcon(':/images/viewer.svg')) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_UID) opts = normalize_settings(parser, opts) diff --git a/src/calibre/gui2/pictureflow/PyQt/configure.py b/src/calibre/gui2/pictureflow/PyQt/configure.py index e24e9a8405..8b6295d817 100644 --- a/src/calibre/gui2/pictureflow/PyQt/configure.py +++ b/src/calibre/gui2/pictureflow/PyQt/configure.py @@ -43,6 +43,7 @@ else: makefile.extra_lib_dirs = ['..\\..\\.build\\release', '../../.build', '.'] makefile.extra_libs = ['pictureflow0' if 'win' in sys.platform and 'darwin' not in sys.platform else "pictureflow"] makefile.extra_cflags = ['-arch i386', '-arch ppc'] if 'darwin' in sys.platform else [] +makefile.extra_lflags = ['-arch i386', '-arch ppc'] if 'darwin' in sys.platform else [] makefile.extra_cxxflags = makefile.extra_cflags # Generate the Makefile itself. diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index 51a9cf97b8..e174f37c7c 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -539,7 +539,10 @@ class Server(Thread): with self.pool_lock: self.pool.append(o) - time.sleep(1) + try: + time.sleep(1) + except: + return def killall(self): diff --git a/src/calibre/utils/fontconfig.py b/src/calibre/utils/fontconfig.py index 9d96de0a76..fe2261d853 100644 --- a/src/calibre/utils/fontconfig.py +++ b/src/calibre/utils/fontconfig.py @@ -23,7 +23,7 @@ match to a given font specification. The main functions in this module are: ''' import sys, os, locale, codecs -from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, \ +from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, util, \ pointer, byref, create_string_buffer, Union, c_char_p, c_double try: @@ -36,18 +36,20 @@ iswindows = 'win32' in sys.platform or 'win64' in sys.platform isosx = 'darwin' in sys.platform def load_library(): - if isosx: - lib = 'libfontconfig.1.dylib' - if hasattr(sys, 'frameworks_dir'): - lib = os.path.join(getattr(sys, 'frameworks_dir'), lib) + if isosx: + lib = os.path.join(getattr(sys, 'frameworks_dir'), 'libfontconfig.1.dylib') \ + if hasattr(sys, 'frameworks_dir') else util.find_library('fontconfig') return cdll.LoadLibrary(lib) elif iswindows: return cdll.LoadLibrary('libfontconfig-1') else: try: - return cdll.LoadLibrary('libfontconfig.so') + return cdll.LoadLibrary(util.find_library('fontconfig')) except: - return cdll.LoadLibrary('libfontconfig.so.1') + try: + return cdll.LoadLibrary('libfontconfig.so') + except: + return cdll.LoadLibrary('libfontconfig.so.1') class FcPattern(Structure): _fields_ = [ @@ -118,9 +120,29 @@ lib.FcFontSort.argtypes = [c_void_p, POINTER(FcPattern), c_int, c_void_p, POINTE lib.FcFontSort.restype = POINTER(FcFontSet) lib.FcFontRenderPrepare.argtypes = [c_void_p, POINTER(FcPattern), POINTER(FcPattern)] lib.FcFontRenderPrepare.restype = POINTER(FcPattern) +lib.FcConfigCreate.restype = c_void_p +lib.FcConfigSetCurrent.argtypes = [c_void_p] +lib.FcConfigSetCurrent.restype = c_int +lib.FcConfigParseAndLoad.argtypes = [c_void_p, POINTER(c_char), c_int] +lib.FcConfigParseAndLoad.restype = c_int +lib.FcConfigBuildFonts.argtypes = [c_void_p] +lib.FcConfigBuildFonts.restype = c_int -if not lib.FcInit(): +# Initialize the fontconfig library. This has to be done manually +# for the OS X bundle as it has its own private fontconfig. +if hasattr(sys, 'frameworks_dir'): + config_dir = os.path.join(os.path.dirname(getattr(sys, 'frameworks_dir')), 'Resources', 'fonts') + if isinstance(config_dir, unicode): + config_dir = config_dir.encode(sys.getfilesystemencoding()) + config = lib.FcConfigCreate() + if not lib.FcConfigParseAndLoad(config, os.path.join(config_dir, 'fonts.conf'), 1): + raise RuntimeError('Could not parse the fontconfig configuration') + if not lib.FcConfigBuildFonts(config): + raise RuntimeError('Could not build fonts') + if not lib.FcConfigSetCurrent(config): + raise RuntimeError('Could not set font config') +elif not lib.FcInit(): raise RuntimeError(_('Could not initialize the fontconfig library')) def find_font_families(allowed_extensions=['ttf']): @@ -151,11 +173,10 @@ def find_font_families(allowed_extensions=['ttf']): ext = os.path.splitext(path)[1] if ext: ext = ext[1:].lower() - if allowed_extensions and ext in allowed_extensions: + if (not allowed_extensions) or (allowed_extensions and ext in allowed_extensions): if lib.FcPatternGetString(pat, 'family', 0, byref(family)) != FcResultMatch.value: raise RuntimeError('Error processing pattern') font_families.append(str(family.contents.value)) - lib.FcObjectSetDestroy(oset) lib.FcPatternDestroy(empty_pattern) From b787f041d3aeafa6e1a6d82359a1b4c042866ec6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 23 Jun 2008 13:38:13 -0700 Subject: [PATCH 26/54] Fix #795 --- src/calibre/__init__.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 050ae5d89c..c338404483 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -38,6 +38,23 @@ try: except: preferred_encoding = 'utf-8' +_abspath = os.path.abspath +def my_abspath(path, encoding=sys.getfilesystemencoding()): + ''' + Work around for buggy os.path.abspath. This function accepts either byte strings, + in which it calls os.path.abspath, or unicode string, in which case it first converts + to byte strings using `encoding`, calls abspath and then decodes back to unicode. + ''' + to_unicode = False + if isinstance(path, unicode): + path = path.encode(encoding) + to_unicode = True + res = _abspath(path) + if to_unicode: + res = res.decode(encoding) + return res + +os.path.abspath = my_abspath def osx_version(): if isosx: From 73882d9dec93655a18b789e8bbbc5eccc7bf3023 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 23 Jun 2008 13:46:11 -0700 Subject: [PATCH 27/54] Fix #808 --- src/calibre/ebooks/lrf/html/convert_from.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 4d93b1a56b..a69b47bab0 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -870,11 +870,12 @@ class HTMLConverter(object, LoggingInterface): append_text(src) else: srcs = src.split('\n') - for src in srcs: - if src: - append_text(src) - if len(srcs) > 1: - self.line_break() + for src in srcs[:-1]: + append_text(src) + self.line_break() + last = srcs[-1] + if len(last): + append_text(last) def line_break(self): self.current_para.append(CR()) From 5cf66bc343cc1d21f00730c6e9cd290ed8c6ad00 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 23 Jun 2008 14:55:56 -0700 Subject: [PATCH 28/54] Fix #812 --- src/calibre/gui2/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index d0260d7ad5..c55b1873b5 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1198,7 +1198,7 @@ path_to_ebook to the database. return 1 sys.excepthook = main.unhandled_exception if len(args) > 1: - main.add_filesystem_book(args) + main.add_filesystem_book(args[1]) return app.exec_() return 0 From 86171e5f60526df76c208118e243fdab251713ad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 23 Jun 2008 18:43:23 -0700 Subject: [PATCH 29/54] ANother fix for #759 --- src/calibre/__init__.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index c338404483..674302bf6d 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -55,6 +55,23 @@ def my_abspath(path, encoding=sys.getfilesystemencoding()): return res os.path.abspath = my_abspath +_join = os.path.join +def my_join(a, *p): + encoding=sys.getfilesystemencoding() + p = [a] + list(p) + _unicode = False + for i in p: + if isinstance(i, unicode): + _unicode = True + break + p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p] + + res = _join(*p) + if _unicode: + res = res.decode(encoding) + return res + +os.path.join = my_join def osx_version(): if isosx: From 051ebfc4497b1f4b01902e224ca5b5c4304ffb1b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 Jun 2008 03:24:11 -0700 Subject: [PATCH 30/54] Fix #815 --- src/calibre/gui2/jobs.py | 17 +++++++++++++---- src/calibre/gui2/widgets.py | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 4a91ef0236..142ab7d920 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -381,10 +381,19 @@ class JobManager(QAbstractTableModel): _('Cannot kill already completed jobs.')).exec_() return if status == 1: - error_dialog(gui_parent, _('Cannot kill job'), - _('Cannot kill waiting jobs.')).exec_() - return - self.process_server.kill(job.id) + self.update_lock.lock() + try: + self.waiting_jobs.remove(job) + self.finished_jobs.append(job) + self.emit(SIGNAL('job_done(int)'), job.id) + job.result = self.process_server.KILL_RESULT + finally: + self.update_lock.unlock() + else: + self.process_server.kill(job.id) + self.reset() + if len(self.running_jobs) + len(self.waiting_jobs) == 0: + self.emit(SIGNAL('no_more_jobs()')) class DetailView(QDialog, Ui_Dialog): diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 1f9de46c5b..06a85128bd 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -231,7 +231,7 @@ class JobsView(TableView): def __init__(self, parent): TableView.__init__(self, parent) - self.connect(self, SIGNAL('activated(QModelIndex)'), self.show_details) + self.connect(self, SIGNAL('doubleClicked(QModelIndex)'), self.show_details) def show_details(self, index): row = index.row() From b49e8b9f9d71f9cd45192a879f01291a2b6fad50 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 Jun 2008 03:37:49 -0700 Subject: [PATCH 31/54] IGN:... --- src/calibre/gui2/main.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index c55b1873b5..d640a75733 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -128,7 +128,7 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.add_menu.actions()[2], SIGNAL("triggered(bool)"), self.add_recursive_multiple) QObject.connect(self.action_del, SIGNAL("triggered(bool)"), self.delete_books) QObject.connect(self.action_edit, SIGNAL("triggered(bool)"), self.edit_metadata) - QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), self.edit_metadata) + QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), partial(self.edit_metadata, bulk=False)) QObject.connect(md.actions()[1], SIGNAL('triggered(bool)'), self.edit_bulk_metadata) QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) QObject.connect(sm.actions()[0], SIGNAL('triggered(bool)'), self.sync_to_main_memory) @@ -550,17 +550,19 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################### Edit metadata ############################## - def edit_metadata(self, checked): + def edit_metadata(self, checked, bulk=None): ''' - Edit metadata of selected books in library individually. + Edit metadata of selected books in library. ''' rows = self.library_view.selectionModel().selectedRows() - if len(rows) > 1: - return self.edit_bulk_metadata(checked) if not rows or len(rows) == 0: d = error_dialog(self, _('Cannot edit metadata'), _('No books selected')) d.exec_() return + + if bulk or (bulk is None and len(rows) > 1): + return self.edit_bulk_metadata(checked) + for row in rows: d = MetadataSingleDialog(self, row.row(), self.library_view.model().db) From 9c3bc20cb82a052a44ca5a6000874b13459260c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Jun 2008 13:31:38 -0700 Subject: [PATCH 32/54] Fix #817 --- src/calibre/gui2/lrf_renderer/main.py | 2 +- src/calibre/gui2/main_window.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 6dd5722bd9..2fc4222a8f 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -285,7 +285,7 @@ def normalize_settings(parser, opts): for opt in parser.option_list: if not opt.dest: continue - if getattr(opts, opt.dest) == opt.default: + if getattr(opts, opt.dest) == opt.default and hasattr(saved_opts, opt.dest): continue setattr(saved_opts, opt.dest, getattr(opts, opt.dest)) return saved_opts diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index 66987228d1..b0ddc0a72d 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -36,7 +36,7 @@ class MainWindow(QMainWindow): def __init__(self, opts, parent=None): QMainWindow.__init__(self, parent) - if opts.redirect: + if getattr(opts, 'redirect', False): self.__console_redirect = DebugWindow(self) sys.stdout = sys.stderr = self.__console_redirect self.__console_redirect.show() From 476e9371bb7937ac92e4d2eec1d1cde5f7f86e01 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Jun 2008 16:05:01 -0700 Subject: [PATCH 33/54] Add support for extracting TOC from MOBI files to mobi2oeb --- src/calibre/ebooks/metadata/opf.py | 6 ++-- src/calibre/ebooks/metadata/opf.xml | 4 +++ src/calibre/ebooks/mobi/reader.py | 50 ++++++++++++++++++++++++----- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index bff9ed5f8a..51b392c70f 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -353,7 +353,7 @@ class OPF(MetaInformation): return reference.get('href') return None - def set_cover(self, path): + def set_cover(self, path, type='cover'): self._initialize() doc = dom.parseString(self.soup.__str__('UTF-8')) package = doc.documentElement @@ -363,11 +363,11 @@ class OPF(MetaInformation): else: guide = doc.createElement('guide') package.appendChild(guide) - el = self._find_element(guide, 'reference', [('type', 'cover')]) + el = self._find_element(guide, 'reference', [('type', type)]) if not el: el = doc.createElement('reference') guide.appendChild(el) - el.setAttribute('type', 'cover') + el.setAttribute('type', type) el.setAttribute('href', path) self._commit(doc) diff --git a/src/calibre/ebooks/metadata/opf.xml b/src/calibre/ebooks/metadata/opf.xml index ed54c10a32..b74c67e085 100644 --- a/src/calibre/ebooks/metadata/opf.xml +++ b/src/calibre/ebooks/metadata/opf.xml @@ -25,6 +25,10 @@ + + + + diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 8f314026f8..22aa95b1e4 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -20,7 +20,7 @@ from calibre.ebooks.mobi.palmdoc import decompress_doc from calibre.ebooks.mobi.langcodes import main_language, sub_language from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf import OPFCreator - +from calibre.ebooks.metadata.toc import TOC class EXTHHeader(object): @@ -172,22 +172,37 @@ class MobiReader(object): self.processed_html) soup = BeautifulSoup(self.processed_html.replace('> <', '>\n<')) + guide = soup.find('guide') for elem in soup.findAll(['metadata', 'guide']): elem.extract() - htmlfile = os.path.join(output_dir, self.name+'.html') + htmlfile = os.path.join(output_dir, self.name+'.html') + for ref in guide.findAll('reference', href=True): + ref['href'] = os.path.basename(htmlfile)+ref['href'] open(htmlfile, 'wb').write(unicode(soup).encode('utf8')) self.htmlfile = htmlfile if self.book_header.exth is not None: - opf = self.create_opf(htmlfile) - opf.render(open(os.path.splitext(htmlfile)[0]+'.opf', 'wb')) + ncx = cStringIO.StringIO() + opf = self.create_opf(htmlfile, guide) + opf.render(open(os.path.splitext(htmlfile)[0]+'.opf', 'wb'), ncx) + ncx = ncx.getvalue() + if ncx: + open(os.path.splitext(htmlfile)[0]+'.ncx', 'wb').write(ncx) def cleanup(self): self.processed_html = re.sub(r'
    ', '', self.processed_html) - def create_opf(self, htmlfile): + def create_opf(self, htmlfile, guide=None): mi = self.book_header.exth.mi opf = OPFCreator(os.path.dirname(htmlfile), mi) + guide_elements, toc = [], None + if guide: + for elem in guide.findAll('reference'): + if elem['type'] == 'toc': + toc = elem['href'] + continue + guide_elements.append((elem['title'], elem['type'], elem['href'])) + opf.extra_mobi_guide_elements = guide_elements if hasattr(self.book_header.exth, 'cover_offset'): opf.cover = 'images/%05d.jpg'%(self.book_header.exth.cover_offset+1) manifest = [(htmlfile, 'text/x-oeb1-document')] @@ -197,6 +212,23 @@ class MobiReader(object): opf.create_manifest(manifest) opf.create_spine([os.path.basename(htmlfile)]) + + if toc: + index = self.processed_html.find(' -1: + raw = ''+self.processed_html[index:] + soup = BeautifulSoup(raw) + tocobj = TOC() + for a in soup.findAll('a', href=True): + try: + text = ''.join(a.findAll(text=True)) + except: + text = '' + tocobj.add_item(toc.partition('#')[0], a['href'][1:], text) + if tocobj is not None: + opf.set_toc(tocobj) + return opf @@ -221,7 +253,6 @@ class MobiReader(object): elif self.book_header.compression_type == '\x00\x01': self.mobi_html = ''.join(text_sections) - else: raise MobiError('Unknown compression algorithm: %s'%repr(self.book_header.compression_type)) @@ -234,7 +265,7 @@ class MobiReader(object): def add_anchors(self): positions = set([]) - link_pattern = re.compile(r']+filepos=[\'"]{0,1}(\d+)[^<>]*>', re.IGNORECASE) for match in link_pattern.finditer(self.mobi_html): positions.add(int(match.group(1))) positions = list(positions) @@ -251,7 +282,10 @@ class MobiReader(object): pos = end self.processed_html += self.mobi_html[pos:] - self.processed_html = link_pattern.sub(lambda match: ' Date: Wed, 25 Jun 2008 19:38:57 -0700 Subject: [PATCH 34/54] Add action to save only specified format when saving to disk --- src/calibre/ebooks/__init__.py | 4 +- src/calibre/ebooks/mobi/reader.py | 2 +- src/calibre/gui2/dialogs/config.py | 14 +- src/calibre/gui2/dialogs/config.ui | 223 ++++++++++++++--------------- src/calibre/gui2/library.py | 8 +- src/calibre/gui2/main.py | 18 ++- src/calibre/library/database.py | 19 +++ 7 files changed, 161 insertions(+), 127 deletions(-) diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 61153bdc8d..dd7e8fc96a 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -15,6 +15,6 @@ class ConversionError(Exception): class UnknownFormatError(Exception): pass -BOOK_EXTENSIONS = ['lrf', 'lrx', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm', +BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm', 'html', 'xhtml', 'epub', 'pdf', 'prc', 'mobi', 'azw', - 'epub', 'fb2', 'djvu'] + 'epub', 'fb2', 'djvu', 'lrx'] diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 22aa95b1e4..87e312ec23 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -222,7 +222,7 @@ class MobiReader(object): tocobj = TOC() for a in soup.findAll('a', href=True): try: - text = ''.join(a.findAll(text=True)) + text = ''.join(a.findAll(text=True)).strip() except: text = '' tocobj.add_item(toc.partition('#')[0], a['href'][1:], text) diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py index 8c1c7fe23d..0b32ab66cd 100644 --- a/src/calibre/gui2/dialogs/config.py +++ b/src/calibre/gui2/dialogs/config.py @@ -3,12 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import os from PyQt4.QtGui import QDialog, QMessageBox, QListWidgetItem, QIcon -from PyQt4.QtCore import SIGNAL, QTimer, Qt, QSize +from PyQt4.QtCore import SIGNAL, QTimer, Qt, QSize, QVariant from calibre import islinux, Settings from calibre.gui2.dialogs.config_ui import Ui_Dialog from calibre.gui2 import qstring_to_unicode, choose_dir, error_dialog from calibre.gui2.widgets import FilenamePattern +from calibre.ebooks import BOOK_EXTENSIONS @@ -58,7 +59,12 @@ class ConfigDialog(QDialog, Ui_Dialog): icons = settings.get('toolbar icon size', self.ICON_SIZES[0]) self.toolbar_button_size.setCurrentIndex(0 if icons == self.ICON_SIZES[0] else 1 if icons == self.ICON_SIZES[1] else 2) self.show_toolbar_text.setChecked(settings.get('show text in toolbar', True)) - + + for ext in BOOK_EXTENSIONS: + self.single_format.addItem(ext.upper(), QVariant(ext)) + + single_format = settings.get('save to disk single format', 'lrf') + self.single_format.setCurrentIndex(BOOK_EXTENSIONS.index(single_format)) def compact(self, toggled): d = Vacuum(self, self.db) @@ -89,7 +95,9 @@ class ConfigDialog(QDialog, Ui_Dialog): settings.set('show text in toolbar', bool(self.show_toolbar_text.isChecked())) pattern = self.filename_pattern.commit() settings.set('filename pattern', pattern) - + settings.set('save to disk single format', BOOK_EXTENSIONS[self.single_format.currentIndex()]) + + if not path or not os.path.exists(path) or not os.path.isdir(path): d = error_dialog(self, _('Invalid database location'), _('Invalid database location ')+path+_('
    Must be a directory.')) d.exec_() diff --git a/src/calibre/gui2/dialogs/config.ui b/src/calibre/gui2/dialogs/config.ui index f6b3957f34..5d00292794 100644 --- a/src/calibre/gui2/dialogs/config.ui +++ b/src/calibre/gui2/dialogs/config.ui @@ -1,4 +1,5 @@ + Kovid Goyal Dialog @@ -76,18 +77,10 @@ 0 - - - - 0 - 0 - 583 - 625 - - - - - + + + + @@ -99,7 +92,7 @@ - + @@ -121,7 +114,7 @@ - + Use &Roman numerals for series number @@ -131,9 +124,35 @@ - - - + + + + + + Format for &single file save: + + + single_format + + + + + + + + + + &Priority for conversion jobs: + + + priority + + + + + + + Default network &timeout: @@ -143,7 +162,7 @@ - + Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information) @@ -164,31 +183,78 @@ - - - - - - &Priority for conversion jobs: - - - priority - - - - - - - + + + + Toolbar + + + + + + + Large + + + + + Medium + + + + + Small + + + + + + + + &Button size in toolbar + + + toolbar_button_size + + + + + + + Show &text in toolbar buttons + + + true + + + + + - + + + + Select visible &columns in library view + + + + + + QAbstractItemView::NoSelection + + + + + + + Frequently used directories - + - + @@ -203,7 +269,7 @@ - + @@ -278,83 +344,6 @@ - - - - Qt::Vertical - - - - 392 - 16 - - - - - - - - Select visible &columns in library view - - - - - - QAbstractItemView::NoSelection - - - - - - - - - - Toolbar - - - - - - - Large - - - - - Medium - - - - - Small - - - - - - - - &Button size in toolbar - - - toolbar_button_size - - - - - - - Show &text in toolbar buttons - - - true - - - - - - @@ -362,8 +351,8 @@ 0 0 - 583 - 625 + 595 + 638 diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index ce9db76eed..d03716b54c 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -150,9 +150,13 @@ class BooksModel(QAbstractTableModel): ''' Return list indices of all cells in index.row()''' return [ self.index(index.row(), c) for c in range(self.columnCount(None))] - def save_to_disk(self, rows, path, single_dir=False): + def save_to_disk(self, rows, path, single_dir=False, single_format=None): rows = [row.row() for row in rows] - self.db.export_to_dir(path, rows, self.sorted_on[0] == 1, single_dir=single_dir) + if single_format is None: + return self.db.export_to_dir(path, rows, self.sorted_on[0] == 1, single_dir=single_dir) + else: + return self.db.export_single_format_to_dir(path, rows, single_format) + def delete_books(self, indices): ids = [ self.id(i) for i in indices ] diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index d640a75733..636f0a888f 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -136,6 +136,7 @@ class Main(MainWindow, Ui_MainWindow): self.save_menu = QMenu() self.save_menu.addAction(_('Save to disk')) self.save_menu.addAction(_('Save to disk in a single directory')) + self.save_menu.addAction(_('Save only %s format to disk')%Settings().get('save to disk single format', 'lrf').upper()) self.view_menu = QMenu() self.view_menu.addAction(_('View')) @@ -144,6 +145,7 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.action_save, SIGNAL("triggered(bool)"), self.save_to_disk) QObject.connect(self.save_menu.actions()[0], SIGNAL("triggered(bool)"), self.save_to_disk) QObject.connect(self.save_menu.actions()[1], SIGNAL("triggered(bool)"), self.save_to_single_dir) + QObject.connect(self.save_menu.actions()[2], SIGNAL("triggered(bool)"), self.save_single_format_to_disk) QObject.connect(self.action_view, SIGNAL("triggered(bool)"), self.view_book) QObject.connect(self.view_menu.actions()[0], SIGNAL("triggered(bool)"), self.view_book) QObject.connect(self.view_menu.actions()[1], SIGNAL("triggered(bool)"), self.view_specific_format) @@ -662,20 +664,32 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################## Save to disk ################################ + def save_single_format_to_disk(self, checked): + self.save_to_disk(checked, True, Settings().get('save to disk single format', 'lrf')) + def save_to_single_dir(self, checked): self.save_to_disk(checked, True) - def save_to_disk(self, checked, single_dir=False): + def save_to_disk(self, checked, single_dir=False, single_format=None): rows = self.current_view().selectionModel().selectedRows() if not rows or len(rows) == 0: d = error_dialog(self, _('Cannot save to disk'), _('No books selected')) d.exec_() return + dir = choose_dir(self, 'save to disk dialog', ('Choose destination directory')) if not dir: return if self.current_view() == self.library_view: - self.current_view().model().save_to_disk(rows, dir, single_dir=single_dir) + failures = self.current_view().model().save_to_disk(rows, dir, + single_dir=single_dir, single_format=single_format) + if failures and single_format is not None: + msg = _('

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

      ')%single_format.upper() + for f in failures: + msg += '
    • %s
    • '%f[1] + msg += '
    ' + warning_dialog(self, _('Could not save some ebooks'), msg).exec_() + QDesktopServices.openUrl(QUrl('file:'+dir)) else: paths = self.current_view().model().paths(rows) self.job_manager.run_device_job(self.books_saved, diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index ceff444186..d80917108e 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1548,6 +1548,25 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; if res is not None: duplicates.extend(res) return duplicates + + def export_single_format_to_dir(self, dir, indices, format, index_is_id=False): + if not index_is_id: + indices = map(self.id, indices) + failures = [] + for id in indices: + try: + data = self.format(id, format, index_is_id=True) + except: + failures.append((id, self.title(id, index_is_id=True))) + title = self.title(id, index_is_id=True) + au = self.authors(id, index_is_id=True) + if not au: + au = _('Unknown') + fname = '%s - %s.%s'%(title, au, format.lower()) + fname = sanitize_file_name(fname) + open(os.path.join(dir, fname), 'wb').write(data) + return failures + class SearchToken(object): From 2199ef433ce83e0945435329e0b2426750bff7e4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 28 Jun 2008 09:41:11 -0700 Subject: [PATCH 35/54] Updated translations --- src/calibre/translations/bg.po | 1015 ++++++----- src/calibre/translations/ca.po | 1030 ++++++----- src/calibre/translations/de.po | 1112 +++++++----- src/calibre/translations/el.po | 2974 +++++++++++++++++++++++++++++++ src/calibre/translations/es.po | 1075 ++++++----- src/calibre/translations/fr.po | 1044 ++++++----- src/calibre/translations/it.po | 1105 +++++++----- src/calibre/translations/nds.po | 1130 +++++++----- src/calibre/translations/nl.po | 1068 ++++++----- src/calibre/translations/ru.po | 1015 ++++++----- src/calibre/translations/sl.po | 1015 ++++++----- src/calibre/translations/te.po | 2974 +++++++++++++++++++++++++++++++ 12 files changed, 11978 insertions(+), 4579 deletions(-) create mode 100644 src/calibre/translations/el.po create mode 100644 src/calibre/translations/te.po diff --git a/src/calibre/translations/bg.po b/src/calibre/translations/bg.po index a8d83a4ce0..0987b34f31 100644 --- a/src/calibre/translations/bg.po +++ b/src/calibre/translations/bg.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.51\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-05-24 06:23+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "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:128 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:134 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:136 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:138 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:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 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:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 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:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,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:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 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:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 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:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /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:380 +#: /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:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 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:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 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:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "
    Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.
    Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "

    There was an error reading from file:
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "

    1. baen - Books from BAEN Publishers
    2. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "
    3. pdftohtml - HTML files that are the output of the program " "pdftohtml
    4. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "
    5. book-designer - HTML0 files from Book Designer
    6. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.

      Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "No help available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 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/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " 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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " 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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 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/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /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:541 msgid "&Word spacing:" msgstr "" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" 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:548 msgid "Header" 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:549 msgid "&Show header" 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:550 msgid "&Header format:" 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:551 msgid "Override
      CSS" 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:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" 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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /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:555 msgid "&Right Margin:" msgstr "" -#: /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:557 msgid "&Top Margin:" 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:559 msgid "&Bottom Margin:" 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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" 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:564 msgid "&Disable chapter detection" 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:565 msgid "&Regular expression:" 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:566 msgid "Add &chapters to table of contents" 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:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" 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:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /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:574 msgid "" "\n" "\n" +"\n" "

      " @@ -1354,36 +1397,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 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:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr "" @@ -1422,49 +1465,49 @@ msgstr "" msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" 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:285 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "" -#: /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:288 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "" -#: /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:295 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:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1493,13 +1536,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "" @@ -1530,67 +1573,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1607,95 +1650,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "

      Could not create recipe. Error:
      %s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "

      Could not create recipe. Error:
      %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "\n" +"\n" "

      " @@ -1527,17 +1577,17 @@ msgid "Edit Meta information" msgstr "Editar Meta-informació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-informació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "&Ordena autors: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1546,19 +1596,19 @@ msgstr "" "exemple,ordena Vicent A. Estellés com a Estellés, Vicent A." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Valoració:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Valora aquest llibre: 0-5 estreles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " estreles" @@ -1597,50 +1647,50 @@ msgstr "No puc aconseguir la coberta" msgid "You must specify the ISBN identifier for this book." msgstr "Cal especificar un ISBN correcte per al llibre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Recull metadades des del servidor" -#: /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:285 msgid "Available Formats" msgstr "Formats disponibles" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Afegir un nou format per a aquest llibre a la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina els formats seleccionats per a aquest llibre de la base de dades." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Recolliu la coberta des del servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 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:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1669,13 +1719,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Sèries" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1706,67 +1756,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1783,95 +1833,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "

      Could not create recipe. Error:
      %s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "

      Could not create recipe. Error:
      %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "\n" +#~ "

      " +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "

      " + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sBenutzung%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Erstellt von " @@ -71,7 +100,7 @@ msgstr "Erstellt von " #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 msgid "Unable to detect the %s disk drive. Try rebooting." -msgstr "Konnte das %s Laufwerk nicht finden. Neustart versuchen." +msgstr "Konnte das Laufwerk %s nicht finden. Versuchen Sie einen Neustart." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 msgid "Set the title. Default: filename." @@ -86,8 +115,12 @@ msgstr "" "angegeben werden. Voreinstellung: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Unbekannt" @@ -110,7 +143,7 @@ msgstr "Sortierung nach Autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Herausgeber" @@ -169,7 +202,7 @@ msgstr "Paragraphen durch Leerzeilen trennen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:107 msgid "Add a header to all the pages with title and author." -msgstr "Kopfzeile mit Titel und Autornamen für alle Seiten einfügen." +msgstr "Kopfzeile mit Titel und Autor für alle Seiten einfügen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:109 msgid "" @@ -222,7 +255,7 @@ msgid "" msgstr "" "Inhalt schwarz-weiß rendern anstatt in den in HTML oder CSS angegeben Farben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 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 " @@ -232,23 +265,39 @@ msgstr "" "unter anderem die Auflösung und die Bildschirmgröße des Zielgerätes fest. " "Voreinstellung: %s Unterstützte Profile: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Linker Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Rechter Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Oberer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Unterer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" +"Tabellen in HTML als Bilder rendern (hilfreich, wenn das Dokument große oder " +"komplexe Tabellen enthält)" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" +"Textgröße in gerenderten Tabellen um diesen Faktor erhöhen. Voreinstellung " +"ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 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 " @@ -258,26 +307,23 @@ msgstr "" "dass Verknüpfungen ignoriert werden. Ein negativer Wert bedeutet, dass alle " " Elemente ignoriert werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -"Ein regulärer Ausdruck. tags, deren Verknüpfungen ignoriert werden. " +"Ein regulärer Ausdruck. Elemente, deren Verknüpfungen ignoriert werden. " "Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Keine Links zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Automatisches Einfügen von Seitenumbrüchen vor ermittelten Kapiteln " -"verhindern." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Automatische Erkennung von Kapiteln verhindern." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -285,7 +331,20 @@ msgstr "" "Der reguläre Ausdruck zur Ermittlung von Kapitelüberschriften. Es wird nach " "mit (h1) - (h6) angegebenen Überschriften gesucht. Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" +"Erkenne einen Kapitelanfang anhand des Elements mit dem angegebenen " +"Attribut. Das Format dieser Option ist tagname regexp,attribute " +"name,attribute value regexp. Um zum Beispiel alle \"header\" (\"h\") " +"Elemente mit dem Attribut class=\"chapter\" anzugleich, müsste man \"h\\" +"d,class,chapter\" benutzen. Voreinstellung ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -304,14 +363,14 @@ msgstr "" "Umblättern der in der LRF Datei verlangsamt. Diese Einstellung wird " "ignoriert, wenn die aktuelle Seite nur wenige Elemente enthält." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Seitenumbruch erzwingen vor Elementen, deren Namen diesem regulären Ausdruck " "entsprechen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -324,16 +383,16 @@ msgstr "" "class=\"chapter\" anzupassen, verwenden Sie \"h\\d,class,chapter\". " "Voreinstellung ist %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." -msgstr "Ermittelte Kapitel zum Inhaltsverzeichnis hinzufügen." +msgstr "Die ermittelten Kapitel zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Baen HTML Dateien vorbearbeiten, um die erstellte LRF Datei zu verbessern." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -341,11 +400,11 @@ msgstr "" "Sie müssen diese Auswahl treffen, wenn sie Dateien, die von pdftohtml " "erstellt wurden, verarbeiten wollen, sonst schlägt die Konvertierung fehl." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Benutzen Sie diese Einstellung bei HTML Dateien von Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -359,27 +418,27 @@ msgstr "" "angegeben: --serif-family \"Times New Roman\"\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "Serife Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "Serifenlose Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "Nichtproportionale Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Zu LRS konvertieren" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -388,7 +447,7 @@ msgstr "" "Benutzen Sie diese Einstellung, wenn sie an einem Rechner mit geringem " "Hauptspeicher arbeiten." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -446,7 +505,7 @@ msgstr "" "%prog [options] dateiname.fb2\n" "\n" "\n" -"%prog ckonvertiert dateiname.fb2 in dateiname.lrf" +"%prog konvertiert dateiname.fb2 in dateiname.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 @@ -465,56 +524,56 @@ msgstr "Einstellungen für html2lrf" msgid "Fetching of recipe failed: " msgstr "Abruf des Rezepts misslungen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer Datei erkannt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalysiere HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen Datei erkannt. Analysiere erneut..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "Vorverarbeitetes HTML gespeichert unter " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Verarbeite %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tKonvertiere in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Konnte Datei nicht analysieren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s ist eine leere Datei" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Fehlschlag bei der Analysierung von %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Konnte Link %s nicht zu TOC hinzufügen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Konnte Bild %s nicht verarbeiten. Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Konnte verschachteltes PNG %s nicht verarbeiten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -522,14 +581,14 @@ msgstr "" "Konnte Bild nicht verarbeiten: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ein Fehler trat während der Bearbeitung einer Tabelle auf: %s. " "Tabellenformat wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -537,11 +596,11 @@ msgstr "" "Schlechte Tabelle:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "Tabelle enthält Zelle, die zu groß ist" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -549,19 +608,19 @@ msgstr "" "Sichern Sie die Website %s zuerst als HTML Datei und benutzen Sie dann " "html2lrf mit der gespeicherten HTML Datei." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Konnte Umschlagbild nicht lesen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Lesen nicht möglich von: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Verarbeitung der OPF Datei schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -898,19 +957,19 @@ msgstr "Benutzung: pdf-meta dateiname.pdf" msgid "No filename specified." msgstr "Kein Dateiname angegeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [options] dateiname.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "Original MOBI HTML gespeichert in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "OEB eBook erstellt in" @@ -918,18 +977,18 @@ msgstr "OEB eBook erstellt in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Bemerkung" @@ -956,33 +1015,33 @@ msgstr "Einfach" msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "
      Must be a directory." msgstr "
      Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.
      Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.
      Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Komprimiere Datenbank. Das kann etwas dauern..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Komprimiere Datenbank..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Konfiguration" @@ -997,21 +1056,21 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1075,7 +1134,7 @@ msgstr "Klein" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 msgid "&Button size in toolbar" -msgstr "&Button Größe in der Symbolleiste" +msgstr "&Größe der Schaltflächen in der Symbolleiste" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 msgid "Show &text in toolbar buttons" @@ -1098,9 +1157,9 @@ msgid "ERROR" msgstr "FEHLER" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autor(en)" @@ -1112,21 +1171,25 @@ msgstr "Sortierung nach Autor" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Verbindung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" "Sie müssen einen gültigen Zugangsschlüssel (access key) für isbndb.com " "angeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Fehler beim Abrufen der Meta-Daten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Keine Meta-Daten gefunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1151,8 +1214,8 @@ msgstr "" "erhalten." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Zugriffsschlüssel:" +msgid "&Access Key:" +msgstr "Zug&angsschlüssel:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1169,7 +1232,7 @@ msgstr "" "Wählen Sie aus der unten stehenden Liste das Buch, das Ihrer Ausgabe " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Details des Auftrags" @@ -1177,6 +1240,10 @@ msgstr "Details des Auftrags" msgid "Unavailable" msgstr "Nicht verfügbar" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - Aufträge" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Aktive Aufträge" @@ -1185,74 +1252,74 @@ msgstr "Aktive Aufträge" msgid "&Stop selected job" msgstr "Ausgewählten Auftrag &stoppen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Meta-Daten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Look & Feel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Seiteneinrichtung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Ermittlung der Kapitel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Keine verfügbaren Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Kann %s nicht konvertieren, da dieses Buch nicht den bekannten Formaten " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Wählen Sie das Format, das zu LRF konvertiert werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Konvertiere %s in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Voreinstellungen zur Konvertierung wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Lesen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Sie haben nicht die nötigen Rechte, um diese Datei zu lesen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "

      There was an error reading from file:
      " msgstr "

      Es trat ein Fehler beim Lesen dieser Datei auf:
      " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " ist kein gültiges Bild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1260,11 +1327,11 @@ msgstr "" "Datei vorbearbeiten bevor sie zu LRF konvertiert wird. Das ist hilfreich, " "wenn Sie wissen, dass die Datei von einer der folgenden Bezugsquellen stammt:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "

      1. baen - Books from BAEN Publishers
      2. " msgstr "
        1. baen - Bücher von BAEN Publishers
        2. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "
        3. pdftohtml - HTML files that are the output of the program " "pdftohtml
        4. " @@ -1272,11 +1339,11 @@ msgstr "" "
        5. pdftohtml - HTML Dateien, die mit dem Programm pdftohtml erstellt " "wurden
        6. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "
        7. book-designer - HTML0 files from Book Designer
        8. " msgstr "
        9. book-designer - HTML Dateien von Book Designer
        10. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.

          Metadata will be " "updated in the database as well as the generated LRF file." @@ -1285,7 +1352,7 @@ msgstr "" "Daten werden sowohl in der Datenbank als auch in der erstellten LRF Datei " "aktualisiert." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1293,7 +1360,7 @@ msgstr "" "Aussehen der erstellten LRF Datei durch die Angabe von Schriftgrößen und " "Wortabständen angleichen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1301,69 +1368,69 @@ msgstr "" "Seiteneinstellungen wie Ränder und die Bildschirmgröße des Zielgeräts " "angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Feineinstellung der Erkennung von Kapitel- und Absatzüberschriften." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "No help available" msgstr "Keine Hilfe verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "eBooks auf einmal zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Kategorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Auswahlmöglichkeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Um&schlagbild der Quelldatei verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Autor(en): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1371,30 +1438,30 @@ msgstr "" "Autor dieses Buches ändern. Mehrere Autoren sollten durch Kommata getrennt " "werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "So&rtierung nach Autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Herausgeber: " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Herausgeber dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "&Etiketten: " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

          They can be any words or phrases, separated by commas." @@ -1403,183 +1470,195 @@ msgstr "" "Büchern.

          Sie können für Etiketten durch Kommata getrennte Wörter " "oder Sätze verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Serien:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Serien. Sie können neue Serien hinzufügen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Index der Serien." -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Buch " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Ausgangsschrift&größe:" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " Punkt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Eingebundene Schriften" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "En&codierung der Quelldatei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "E&inrücken mindestens:" -#: /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:541 msgid "&Word spacing:" msgstr "&Wortabstand:" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Automatische &Rotation von Bildern einschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "&Leerzeilen zwischen Paragraphen einfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "&Tabellen ignorieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Farben nicht bea&chten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Vorbearbeiten:" -#: /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:548 msgid "Header" msgstr "Kopfzeile" -#: /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:549 msgid "&Show header" msgstr "Kopfzeile an&zeigen" -#: /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:550 msgid "&Header format:" msgstr "&Kopfzeilenformat:" -#: /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:551 msgid "Override
          CSS" msgstr "CSS
          überschreiben" -#: /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:552 msgid "&Profile:" msgstr "&Profil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Rand:" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " Pixel" -#: /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:555 msgid "&Right Margin:" msgstr "&Rechter Rand:" -#: /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:557 msgid "&Top Margin:" msgstr "&Oberer Rand:" -#: /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:559 msgid "&Bottom Margin:" msgstr "&Unterer Rand:" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "&Konvertiere Tabellen in Bilder (gut bei großen/komlexen Tabellen)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "&Faktor der Textgröße in gerenderten Tabellen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Auf Titel basierende Ermittlung" -#: /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:564 msgid "&Disable chapter detection" msgstr "Kapitel Ermittlung &deaktivieren" -#: /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:565 msgid "&Regular expression:" msgstr "&Regulärer Ausdruck:" -#: /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:566 msgid "Add &chapters to table of contents" msgstr "&Kapitel zum Inhaltsverzeichnis hinzufügen" -#: /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:567 msgid "Don't add &links to the table of contents" msgstr "Keine &Links zum Inhaltsverzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Auf Etiketten basierende Ermittlung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "&Seitenumbruch vor Element:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "Seitenumbruch vor Element &erzwingen:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Seitenumbruch vor &Attribut erzwingen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "Erkenne K&apitel bei Element:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Hilfe für das jeweilige Objekt" -#: /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:574 msgid "" "\n" "\n" +"\n" "

          " @@ -1589,8 +1668,8 @@ msgstr "" "\n" +"\n" "

          " @@ -1600,17 +1679,17 @@ msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-Informationen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1619,19 +1698,19 @@ msgstr "" "Dickens\" zum Beispiel als \"Dickens, Charles\"." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Bewertung:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " Sterne" @@ -1674,50 +1753,50 @@ msgstr "Kann kein Umschlagbild abrufen" msgid "You must specify the ISBN identifier for this book." msgstr "Sie müssen die ISBN für dieses Buch angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Serien entfernen (Serien ohne Bücher)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Meta-Daten vom Server abrufen" -#: /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:285 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Umschlagbild vom Server abrufen" -#: /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:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Benutzername und/oder Passwort Ihres Kontos bei LibraryThing.com ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Passwort ändern" @@ -1746,13 +1825,13 @@ msgid "Tag" msgstr "Etikett" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1787,39 +1866,39 @@ msgstr "" msgid "Negate" msgstr "Ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Übereinstimmung mit a&llen der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Übereinstimmung mit irge&ndeinem der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Suchkriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Mehr" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Weniger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Etiketten Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "&Verfügbare Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1827,23 +1906,23 @@ msgstr "" "Etikett aus der Datenbank löschen. Entfernt das Etikett von allen Büchern " "und löscht es dann aus der Datenbank." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Etikett dem aktuellen Buch zuweisen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Zuge&wiesene Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Etikett vom aktuellen Buch entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Etikett &anfügen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1851,7 +1930,7 @@ msgstr "" "Ist das gewünschte Etikett nicht in der Liste, kann es hier hinzugefügt " "werden. Akzeptiert eine durch Kommata getrennte Liste von Etiketten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Etikett zu den verfügbaren Etiketten hinzufügen und dem aktuellen Buch " @@ -1870,96 +1949,96 @@ msgid "Recipe for " msgstr "Rezept für " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "In erweiterten Modus umschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Zum Basis Modus wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Feed benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "Feed %s benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Gibts hier schon" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Dieser Feed wurde schon zu diesem Rezept hinzugefügt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Ungültige Eingabe" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Ungültige Eingabe" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "

          Could not create recipe. Error:
          %s" msgstr "

          Konnte Rezept nicht erstellen. Fehler:
          %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Rezept ersetzen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" "Es gibt schon ein erstelltes Rezept mit dem Namen %s. Soll es ersetzt werden?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Eine Rezept Datei auswählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Eigene Nachrichtenquelle hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Verfügbare Benutzer-Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Rezept &hinzufügen/aktualisieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "Rezept entfe&rnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "Rezept ver&teilen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "Rezept aus Datei &laden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "\n" +"

          " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 +msgid "Edit Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +msgid "Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +msgid "Author S&ort: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +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:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +msgid "&Rating:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +msgid "Rating of this book. 0-5 stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +msgid " stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 +msgid "Add Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 +msgid "&Remove tags:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 +msgid "Comma separated list of tags to remove from the books. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +msgid "" +"

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

          " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "Could not fetch cover.
          " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "Could not fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "Cannot fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "You must specify the ISBN identifier for this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +msgid "Edit Meta Information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +msgid "Open Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Fetch metadata from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +msgid "Available Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +msgid "Add a new format for this book to the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +msgid "Remove the selected formats for this book from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +msgid "Fetch cover image from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +msgid "" +"Change the username and/or password for your account at LibraryThing.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +msgid "Change password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:55 +msgid "Password needed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 +msgid "&Username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 +msgid "&Password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 +msgid "&Show password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:15 +msgid "Author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:17 +msgid "Tag" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 +msgid "Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:21 +msgid "Any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 +msgid "Form" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 +msgid "contains" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 +msgid "The text to search for. It is interpreted as a regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 +msgid "" +"

          Negate this match. That is, only return results that do not match " +"this query." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39 +msgid "Negate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 +msgid "Advanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 +msgid "Match a&ll of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 +msgid "Match a&ny of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 +msgid "Search criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +msgid "More" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +msgid "Fewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 +msgid "Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 +msgid "A&vailable tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 +msgid "" +"Delete tag from database. This will unapply the tag from all books and then " +"remove it from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 +msgid "Apply tag to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 +msgid "A&pplied tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 +msgid "Unapply (remove) tag from current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +msgid "&Add tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +msgid "" +"If the tag you want is not in the available list, you can add it here. " +"Accepts a comma separated list of tags." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 +msgid "Add tag to available tags and apply it to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:63 +msgid "No recipe selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:69 +msgid "The attached file: %s is a recipe to download %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:70 +msgid "Recipe for " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 +msgid "Switch to Advanced mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 +msgid "Switch to Basic mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +msgid "Feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 +msgid "The feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +msgid "Feed must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 +msgid "The feed %s must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 +msgid "This feed has already been added to the recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "

          Could not create recipe. Error:
          %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 +msgid "A custom recipe named %s already exists. Do you want to replace it?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Choose a recipe file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 +msgid "Add custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 +msgid "Available user recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 +msgid "Add/Update &recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 +msgid "&Remove recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 +msgid "&Share recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 +msgid "&Load recipe from file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 +msgid "" +"\n" +"

          Create a basic news " +"recipe, by adding RSS feeds to it.
          For most feeds, you will have to " +"use the \"Advanced mode\" to further customize the fetch " +"process.

          " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 +msgid "Recipe &title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 +msgid "&Oldest article:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 +msgid "The oldest article to download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 +msgid " days" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 +msgid "&Max. number of articles per feed:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +msgid "Maximum number of articles to download per feed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +msgid "Feeds in recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +msgid "Remove feed from recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 +msgid "Add feed to recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +msgid "&Feed title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 +msgid "Feed &URL:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 +msgid "&Add feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +msgid "" +"For help with writing advanced news recipes, please visit User Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +msgid "Recipe source code (python)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 +msgid "" +"

          Set a regular expression pattern to use when trying to guess ebook " +"metadata from filenames.

          A reference on the syntax of regular expressions is " +"available.

          Use the Test functionality below to test your regular " +"expression on a few sample filenames." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:98 +msgid "Regular &expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:99 +msgid "&Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:100 +msgid "File &name:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:101 +msgid "Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:102 +msgid "Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:103 +msgid "Regular expression group name (?P)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:61 +msgid "No match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +msgid "Authors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +msgid "Regular expression group name (?P<authors>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108 +msgid "Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109 +msgid "Regular expression group name (?P<series>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +msgid "Series index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +msgid "Regular expression group name (?P<series_index>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 +msgid "ISBN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 +msgid "Job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 +msgid "Status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 +msgid "Progress" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 +msgid "Running time" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Waiting" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 +msgid "Cannot kill job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 +msgid "" +"Cannot kill jobs that are communicating with the device as this may cause " +"data corruption." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 +msgid "Cannot kill already completed jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 +msgid "Cannot kill waiting jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +msgid "Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 +msgid "Double click to <b>edit</b> me<br><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 +msgid "Size (MB)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 +msgid "Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 +msgid "Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +msgid "Configure Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +msgid "Use white background" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:50 +msgid "Hyphenate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:51 +msgid "<b>Changes will only take affect after a restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 +msgid " - LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "No matches found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128 +msgid "LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:129 +msgid "Parsing LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:130 +msgid "LRF Viewer toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 +msgid "Next Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 +msgid "Previous Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133 +msgid "Back" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134 +msgid "Forward" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135 +msgid "Next match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:136 +msgid "Open ebook" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137 +msgid "Configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +msgid "" +"<p>For help visit <a " +"href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 +msgid "Send to main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +msgid "Send to storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +msgid "Edit metadata individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +msgid "Edit metadata in bulk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +msgid "" +"Add books recursively (One book per directory, assumes every ebook file is " +"the same book in a different format)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +msgid "" +"Add books recursively (Multiple books per directory, assumes every ebook " +"file is a different book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +msgid "Save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +msgid "View" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 +msgid "Device database corrupted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +msgid "" +"\n" +" <p>The database of books on the reader is corrupted. Try the " +"following:\n" +" <ol>\n" +" <li>Unplug the reader. Wait for it to finish regenerating " +"the database (i.e. wait till it is ready to be used). Plug it back in. Now " +"it should work with %(app)s. If not try the next step.</li>\n" +" <li>Quit %(app)s. Find the file media.xml in the reader's " +"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +"file. Re-connect it and start %(app)s.</li>\n" +" </ol>\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 +msgid "" +"<p>Books with the same title as the following already exist in the database. " +"Add them anyway?<ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 +msgid "Duplicates found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 +msgid "No space on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 +msgid "" +"<p>Cannot upload books to device there is no more free space available " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 +msgid "Sending books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 +msgid "No suitable formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 +msgid "" +"Could not upload the following books to the device, as no suitable formats " +"were found:<br><ul>%s</ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 +msgid "Fetch news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 +msgid "News fetched. Uploading to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 +msgid "Starting Bulk conversion of %d books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +msgid "%s has no available formats." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure while there are running jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 +msgid "Copying database to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 +msgid "Invalid database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 +msgid "" +"<p>An invalid database already exists at %s, delete it before trying to move " +"the existing database.<br>Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 +msgid "Could not move database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 +msgid "No detailed info available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 +msgid "No detailed information is available for books on the device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 +msgid "Error talking to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 +msgid "Conversion Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "Database does not exist" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "" +"The directory in which the database should be: %s no longer exists. Please " +"choose a new database location." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 +msgid "" +"<span style=\"color:red; font-weight:bold\">Latest version: <a " +"href=\"%s\">%s</a></span>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "" +"%s has been updated to version %s. See the <a " +"href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " +"Visit the download page?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "Update available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +msgid "calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +msgid "Advanced search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +msgid "Alt+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +msgid "" +"Search the list of books by title or author<br><br>Words separated by spaces " +"are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +msgid "" +"Search the list of books by title, author, publisher, tags and " +"comments<br><br>Words separated by spaces are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 +msgid "Reset Quick Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +msgid "Add books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +msgid "Edit meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +msgid "E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +msgid "Send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +msgid "S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +msgid "Fetch news" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +msgid "F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +msgid "Convert E-books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +msgid "C" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 +msgid "V" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 +msgid "Add a custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 +msgid "" +"<p>Please enter your username and password for %s<br>If you do not have one, " +"please subscribe to get access to the articles.<br/> Click OK to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 +msgid "Custom news sources" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to browse books by their covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to turn off Cover Browsing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +msgid "" +"<p>Browsing books by their covers is disabled.<br>Import of pictureflow " +"module failed:<br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:38 +msgid "Invalid regular expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:39 +msgid "Invalid regular expression: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 +msgid "" +"Reader\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 +msgid "" +"Card\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 +msgid "Click to see the list of books available on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 +msgid "Click to see the list of books in the main memory of your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 +msgid "Click to see the list of books on the storage card in your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 +msgid "" +"Path to the calibre database. Default is to use the path stored in the " +"settings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 +msgid "" +"%prog list [options]\n" +"\n" +"List the books available in the calibre database. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +msgid "" +"The fields to display when listing books in the database. Should be a comma " +"separated list of fields.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +msgid "" +"The field by which to sort the results.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +msgid "Sort results in ascending order" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 +msgid "" +"Filter the results by the search query. For the format of the search query, " +"please see the search related documentation in the User Manual. Default is " +"to do no filtering." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 +msgid "Invalid fields. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 +msgid "Invalid sort field. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +msgid "" +"The following books were not added as they already exist in the database " +"(see --duplicates option):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +msgid "" +"%prog add [options] file1 file2 file3 ...\n" +"\n" +"Add the specified files as books to the database. You can also specify " +"directories, see\n" +"the directory related options below. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +msgid "" +"Assume that each directory has only a single logical book and that all files " +"in it are different e-book formats of that book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +msgid "Process directories recursively" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +msgid "" +"Add books to database even if they already exist. Comparison is done based " +"on book titles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +msgid "You must specify at least one file to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +msgid "" +"%prog remove ids\n" +"\n" +"Remove the books identified by ids from the database. ids should be a comma " +"separated list of id numbers (you can get id numbers by using the list " +"command). For example, 23,34,57-85\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +msgid "You must specify at least one book to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +msgid "" +"%prog add_format [options] id ebook_file\n" +"\n" +"Add the ebook in ebook_file to the available formats for the logical book " +"identified by id. You can get id by using the list command. If the format " +"already exists, it is replaced.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +msgid "You must specify an id and an ebook file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +msgid "ebook file must have an extension" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +msgid "" +"\n" +"%prog remove_format [options] id fmt\n" +"\n" +"Remove the format fmt from the logical book identified by id. You can get id " +"by using the list command. fmt should be a file extension like LRF or TXT or " +"EPUB. If the logical book does not have fmt available, do nothing.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +msgid "You must specify an id and a format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +msgid "" +"%%prog command [options] [arguments]\n" +"\n" +"%%prog is the command line interface to the calibre books database. \n" +"\n" +"command is one of:\n" +" %s\n" +" \n" +"For help on an individual command: %%prog command --help\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +msgid "Could not initialize the fontconfig library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 +msgid "URL must have the scheme sftp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:57 +msgid "host must be of the form user@hostname" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:68 +msgid "Failed to negotiate SSH session: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:71 +msgid "Failed to authenticate with server: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:77 +msgid "Unknown feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 +msgid "Untitled article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:15 +msgid "" +"%%prog [options] ARG\n" +"\n" +"%%prog parses an online source of articles, like an RSS or ATOM feed and \n" +"fetches the article contents organized in a nice hierarchy.\n" +"\n" +"ARG can be one of:\n" +"\n" +"file name - %%prog will try to load a recipe from the file\n" +"\n" +"builtin recipe title - %%prog will load the builtin recipe and use it to " +"fetch the feed. For e.g. Newsweek or \"The BBC\" or \"The New York Times\"\n" +"\n" +"recipe as a string - %%prog will load the recipe directly from the string " +"arg.\n" +"\n" +"Available builtin recipes are:\n" +"%s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37 +msgid "" +"Options to control web2disk (used to fetch websites linked from feeds)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:40 +msgid "" +"Specify a list of feeds to download. For example: \n" +"\"['http://feeds.newsweek.com/newsweek/TopNews', " +"'http://feeds.newsweek.com/headlines/politics']\"\n" +"If you specify this option, any argument to %prog is ignored and a default " +"recipe is used to download the feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 +msgid "Be more verbose while processing." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 +msgid "" +"The title for this recipe. Used as the title for any ebooks created from the " +"downloaded feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:47 +msgid "Username for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:48 +msgid "Password for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:51 +msgid "" +"Number of levels of links to follow on webpages that are linked to from " +"feeds. Defaul %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53 +msgid "" +"The directory in which to store the downloaded feeds. Defaults to the " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55 +msgid "Dont show the progress bar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 +msgid "Very verbose output, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 +msgid "" +"Useful for recipe development. Forces max_articles_per_feed to 2 and " +"downloads at most 2 feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:576 +msgid "Fetching feeds..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:33 +msgid "Unknown News Source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:474 +msgid "Download finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:476 +msgid "Failed to download the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:478 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:484 +msgid " from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:482 +msgid "Failed to download parts of the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:486 +msgid "\tFailed links:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:558 +msgid "Could not fetch article. Run with --debug to see the reason" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 +msgid "Got feeds from index page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 +msgid "Trying to download cover..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:636 +msgid "Starting download [%d thread(s)]..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:649 +msgid "Feeds downloaded to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:659 +msgid "Could not download cover: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:664 +msgid "Downloading cover from %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +msgid "Untitled Article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:743 +msgid "" +"\n" +"Downloaded article %s from %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 +msgid "Article downloaded: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:755 +msgid "Failed to download article: %s from %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 +msgid "Article download failed: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:775 +msgid "Fetching feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:382 +msgid "" +"%prog URL\n" +"\n" +"Where URL is for example http://google.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:385 +msgid "Base directory into which URL is saved. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:388 +msgid "" +"Timeout in seconds to wait for a response from the server. Default: %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:391 +msgid "" +"Maximum number of levels to recurse i.e. depth of links to follow. Default " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:394 +msgid "" +"The maximum number of files to download. This only applies to files from <a " +"href> tags. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:396 +msgid "" +"Minimum interval in seconds between consecutive fetches. Default is %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:398 +msgid "" +"The character encoding for the websites you are trying to download. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:400 +msgid "" +"Only links that match this regular expression will be followed. This option " +"can be specified multiple times, in which case as long as a link matches any " +"one regexp, it will be followed. By default all links are followed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:402 +msgid "" +"Any link that matches this regular expression will be ignored. This option " +"can be specified multiple times, in which case as long as any regexp matches " +"a link, it will be ignored.By default, no links are ignored. If both --" +"filter-regexp and --match-regexp are specified, then --filter-regexp is " +"applied first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:404 +msgid "Do not download CSS stylesheets." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:405 +msgid "Show detailed output information. Useful for debugging" +msgstr "" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index 60e3560a54..47c9ae69a6 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-15 08:31+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-25 21:29+0000\n" "Last-Translator: S. Dorscht <Unknown>\n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -37,6 +37,12 @@ msgstr "" #~ "Expresión regular. Las marcas <a> que tengan href coincidentes, son " #~ "ignoradas. Por defecto: %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Evita la inserción automática de saltos de página delante de los capítulos " +#~ "detectados." + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -57,6 +63,12 @@ msgstr "" #~ "fuents, familia\" ( --serif-family \"%s, Times New Roman\")\n" #~ " " +#~ msgid "&Access Key;" +#~ msgstr "Clave de &acceso;" + +#~ msgid "Job killed by user" +#~ msgstr "Trabajo detenido por el usuario" + #~ msgid "%s is not available in LRF format. Please convert it first." #~ msgstr "\"%s\" no es un archivo LRF. Conviértalo primero." @@ -139,11 +151,34 @@ msgstr "" #~ "Guardar el texto de abajo en el archivo recipe.py y enviarlo a un amigo para " #~ "permitirle también a él usar esta receta." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Creado por " @@ -166,8 +201,12 @@ msgstr "" "defecto: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Desconocido" @@ -190,7 +229,7 @@ msgstr "Clave de orden para el autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editorial" @@ -296,7 +335,7 @@ msgstr "" "Generar todo el contenido en negro sobre blanco en lugar de los colores " "indicados por el HTML o CSS." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 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 " @@ -306,23 +345,35 @@ msgstr "" "determina, entre otras cosas, la resolución y el tamaño de la pantalla del " "dispositivo. Por defecto: %s Perfiles soportados: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Margen izquierdo de la página. Por defecto: %default px." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Margen derecho de la página. Por defecto: %default px." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Margen superior de la página. Por defecto: %default px." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Margen inferior de la página. Por defecto: %default px." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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 <a> tags are " @@ -331,7 +382,7 @@ msgstr "" "Número máximo de niveles para procesar enlaces recursivamente. El valor 0 " "(cero) indica que no se seguirán. Un valor negativo, ignora las marcas <a>." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -339,18 +390,15 @@ msgstr "" "Una expresión regular. Las etiquetas <a> cuyos atributos href coincidan " "serán ignoradas. Por defecto es %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "No incluir enlaces en el índice de contenidos" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Evita la inserción automática de saltos de página delante de los capítulos " -"detectados." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Impedir la detección automática de capítulos." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -358,7 +406,15 @@ msgstr "" "Expressión regular utilizada para detectar los títulos de los capítulos. " "Busca las marcas de encabezado (h1-h6). Por defecto: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -376,14 +432,14 @@ msgstr "" "cambio de página en el archivo LRF. Esta opción se ignora si la página " "actual tiene pocos elementos." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Forzar un salto de página previo a las etiquetas cuyos nombres coincidan con " "esta expresión regular." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -395,16 +451,16 @@ msgstr "" "ejemplo, \"h\\d,class,chapter\", coincide con todas las marcas de encabezado " "que tienen el atributo class=\"chapter\". Por defecto: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "Incluir capítulos detectados en el índice de contenidos." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Preprocesa los archivos Baen HTML para mejorar el archivo LRF generado." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -412,11 +468,11 @@ msgstr "" "Es necesario activar esta opción para archivos generados con pdftohtml, para " "evitar que la conversión falle." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Utilice esta opción para archivos html0 de Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -424,27 +480,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "Familia de fuentes serif per a incrustar." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "Familia de fuentes sans-serif a incrustar." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "Familia de fuentes monoespaiadas a incrustar." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Ser prolijo al procesar" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Convertir a LRS" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -452,7 +508,7 @@ msgstr "" "Minimizar el uso de memoria, a cambio de mayor tiempo de procesador. Usar " "esta opción si el equipo no dispone de mucha RAM." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -523,56 +579,56 @@ msgstr "Opciones para controlar el comportamiento de html2rtf" msgid "Fetching of recipe failed: " msgstr "Obtención fallida de la receta: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer archivo detectado." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalizando HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen archivo detectado. Volver a analizar..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "HTML preprocesado escrito en " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Procesando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConversión a BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "No se pudo analizar el archivo: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s es un archivo vacío" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "No se pudo analizar el enlace %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "No se puedo añadir el enlac %s al TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Incapaz de procesar imagen %s. Error: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Incapaz de procesar PNG entrelazado %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -580,14 +636,14 @@ msgstr "" "No se puedo procesar imagen: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ocurrió un error al procesar la tabla: %s. Se ignora la identificación de la " "tabla." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -595,11 +651,11 @@ msgstr "" "Tabla errónea:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "La tabla contiene una celda demasiado larga" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -607,19 +663,19 @@ msgstr "" "Primero debe guardar la página web %s como un archivo html y después " "ejecutar html2rtf sobre él." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "No se puedo leer la imagen de portada: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "No se puedo leer de: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Incapaz de procesar el archivo opf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -947,19 +1003,19 @@ msgstr "Uso: pdf-meta archivo.pdf" msgid "No filename specified." msgstr "Nombre de archivo sin especificar." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opciones] miebook.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Directorio de salida. Por defecto es el directorio actual" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "HTML MOBI en bruto guardado en" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "Ebook OEB creado en" @@ -967,18 +1023,18 @@ msgstr "Ebook OEB creado en" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Título" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Comentarios" @@ -1005,33 +1061,33 @@ msgstr "Básico" msgid "Advanced" msgstr "Avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Debe ser un directorio." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Ubicación no válida " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Ubicación no válida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Ubicación no válida.<br>Imposible escribir en " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Compactando base de datos. Esto podría durar un rato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Compactando..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuración" @@ -1046,21 +1102,21 @@ msgstr "Navegar a la nueva ubicación de la base de datos" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1145,9 +1201,9 @@ msgid "ERROR" msgstr "ERROR" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autor(es)" @@ -1159,19 +1215,23 @@ msgstr "Ordenación por autor" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "No se puede conectar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "Especifica una clave de acceso válida para isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Error de obtención de metadatos" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "No encontró metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1195,8 +1255,8 @@ msgstr "" "acceso." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "Clave de &acceso;" +msgid "&Access Key:" +msgstr "&Clave de acceso:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1211,7 +1271,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "Seleccionar el libro que más se aproxime al listado mostrado abajo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Detalles del trabajo" @@ -1219,6 +1279,10 @@ msgstr "Detalles del trabajo" msgid "Unavailable" msgstr "No disponible" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - encargos" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Trebajos activos" @@ -1227,72 +1291,72 @@ msgstr "Trebajos activos" msgid "&Stop selected job" msgstr "&Detener trabajo seleccionado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Apariencia" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Configuración de página" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Detección de capítulos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Formatos no disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "No se puede convertir %s porque el formato no está soportado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Elegir el formato a conertir en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Convertir %s a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Fijar valores de conversión por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "No se puede leer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "No tienes permiso de lectura en el archivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Error leyendo archivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Hubo un error leyendo el archivo: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " no es una imagen válida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1300,22 +1364,22 @@ msgstr "" "Preprocesar el archivo antes de convertir a LRF, útil si se conoce el origen " "del archivo. Tipos de archivos conocidos:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Libros de BAEN Publishers</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - Archivos HTML creados con el programa pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - Archivos HTML0 de Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1323,7 +1387,7 @@ msgstr "" "Especificar datos como título y autor para el libro.<p>Esta información se " "actualiza tanto en la base de datos como en el archivo LRF." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1331,76 +1395,76 @@ msgstr "" "Mejorar la apariencia del archivo LRF generado, especificando el tamaño de " "fuente y el espaciado entre palabras." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" "Configuración de página del dispositivo: márgenes y tamaño de la pantalla" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Afinar la detección de capítulos y secciones." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Ayuda no disponible</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Convertir ebooks a LRF en masa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Convertir a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categoría" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opciones" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Portada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Cambia la imagen de &portada:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Localizar una imagen a utilizar como portada de este libro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Usar portada del archivo &fuente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Título: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Cambiar el título del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Autor(es): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1408,30 +1472,30 @@ msgstr "" "Cambia el(los) autor(es). Para especificar más de uno, sepárelos mediante " "comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "O&rd&en por autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editorial: " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Cambia la editorial del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Etique&tas: " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1439,214 +1503,217 @@ msgstr "" "Etiquetas para categorizar el libr (muy útil en búsquedas). <br><br>Puede " "utilizarse qualquier palabra o frase, separada medante comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Series:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Listado de series conocidas. Se puede añadir nuevas series." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Índice de serie." -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Libro " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Tamaño de la &fuente base:" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " puntos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Fuentes incrustadas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "&Codificación de la fuente:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "&Sangrado mínimo:" -#: /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:541 msgid "&Word spacing:" msgstr "&Espaciado de palabras:" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Activa la &rotación automática de imágenes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Inserta líneas en &blanco entre párrafos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignora las &tablas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Ignorar &colores" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocesamiento:" -#: /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:548 msgid "Header" msgstr "Encabezado" -#: /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:549 msgid "&Show header" msgstr "&Mostrar encabezado" -#: /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:550 msgid "&Header format:" msgstr "&Formato del encabezado:" -#: /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:551 msgid "Override<br>CSS" msgstr "Substituye<br>CSS" -#: /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:552 msgid "&Profile:" msgstr "&Perfil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margen &Izquierdo:" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " Píxeles" -#: /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:555 msgid "&Right Margin:" msgstr "Margen &Derecho:" -#: /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:557 msgid "&Top Margin:" msgstr "Margen &Superior:" -#: /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:559 msgid "&Bottom Margin:" msgstr "Margen &Inferior:" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" +"&Convertir las tablas a imágenes (bueno para tablas grandes y complejas)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Detección basada en el título" -#: /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:564 msgid "&Disable chapter detection" msgstr "&Desactivar detección de capítulos" -#: /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:565 msgid "&Regular expression:" msgstr "Expresión &Regular:" -#: /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:566 msgid "Add &chapters to table of contents" msgstr "Añadir &capítulos a la tabla de contenidos" -#: /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:567 msgid "Don't add &links to the table of contents" msgstr "No añada &enlaces a la tabla de contenidos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Detección basada en etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "Inserta un salto de &página delante de la marca:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Fuerza un salto de página delante de la marca:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Fuerza un salto de página delante del &atributo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Ayuda con el ítem" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" msgstr "" -"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " -"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" -"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " -"type=\"text/css\">\n" -"p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" -"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " -"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" -"family:'Sans Serif'; font-size:9pt;\"></p></body></html>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 msgid "Edit Meta information" msgstr "Editar Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "&Ordenar autores: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1655,19 +1722,19 @@ msgstr "" "Federico García Lorca como Lorca, Federico" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Valoración:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Valora este libro: 0-5 estrellas" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " estrellas" @@ -1709,52 +1776,52 @@ msgstr "No se puede descargar la portada" msgid "You must specify the ISBN identifier for this book." msgstr "Especifique primero un ISBN válido para el libro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Editar meta-información" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Abrir editor de etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" "Eliminar series que no están en uso (series que no tienen ningún libro " "asociado)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Buscar metadatos en el servidor" -#: /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:285 msgid "Available Formats" msgstr "Formatos disponibles" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Añadir un nuevo formato para este libro en la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina los formatos seleccionados para este libro de la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Buscar portada en el servidor" -#: /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:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "Cambiar nombre de usuario y/o clave de tu cuenta de LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Cambiar contraseña" @@ -1783,13 +1850,13 @@ msgid "Tag" msgstr "Etiqueta" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Series" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formato" @@ -1822,39 +1889,39 @@ msgstr "" msgid "Negate" msgstr "Negar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Búsqueda avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Satisfacer todos los criterios siguientes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Satisfacer alguno de los siguientes criterios" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Criterios de búsqueda" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Más" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Menos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editor de etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Etiquetas disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1862,23 +1929,23 @@ msgstr "" "Borrar etiquetas de la base de datos. Esta acción desasignará la etiqueta de " "todos los libros y la borrará de la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Aplicar etiqueta al libro actual" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Etiquetas aplicadas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Eliminar etiqueta del libro actual" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "añadir etiqueta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1887,7 +1954,7 @@ msgstr "" "la puede añadir desde aquí. También puede usar una lista de etiquetas " "separadas por comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Añadir etiqueta a la lista de etiquetas disponibles y aplicarla al libro " @@ -1906,95 +1973,95 @@ msgid "Recipe for " msgstr "Receta para " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "Cambiar a modo avanzado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Cambiar a modo básico" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "el Feed debe tener un título" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Newsfeed tiene que aver un título" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "El feed ha de tener una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "el Feed debe tener una dirección" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Ya existe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Este Feed ya se ha añadido a la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Entrada incorrecta" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Entrada incorrecta" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>No se puede crear la receta. Error:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Reemplazar la receta?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "una receta personalizada llamada %s ya existe. Quiere reemplazarla?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Seleccionar un archivo de receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Recetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Añadir nueva fuente personalizada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Recetas de usuario disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Añadir/Actualizar &receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Eliminar receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "&Compartir receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "&Cargar receta desde un archivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -2018,56 +2085,56 @@ msgstr "" "necesitará utilizar el \"modo avanzado\" para una configuración mas " "detallada del proceso de adquisición de los datos</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Título de la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "&Artículo más antiguo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "El artículo más antiguo a descargar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " días" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "Número máximo de articulos por feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Número máximo de articulos a descargar por cada feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds en la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Eliminar feeds de la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Añadir feeds a la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Título del newsfeed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Newsfeed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "&Añadir feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2076,7 +2143,7 @@ msgstr "" "<a href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Recetas de " "Usuario</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Código fuente de la receta (python)" @@ -2161,45 +2228,45 @@ msgstr "Nombre de grupo de expresión regular (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Trabajo" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Estado" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progreso" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Tiempo transcurrido en ejecución" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Error" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Terminado" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "En espera..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Procesando..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "No se puede detener este trabajo" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2207,62 +2274,62 @@ msgstr "" "No se pueden detener los trabajos que estan en comunicación con el " "dispositivo ya que pueden causar corrupción de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "No se pueden detener trabajos ya finalizados" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "No se pueden detener trabajos en espera" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Ninguno" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formatos" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Libro <font face=\"serif\">%s</font> de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doble click para <b>editarme</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Tamaño (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Fecha" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Valoración" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Ruta" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Marca de tiempo" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" "Búsqueda (Para Busqueda Avanzada, haga click en el boton de la izquierda)" @@ -2283,15 +2350,15 @@ msgstr "Partición de palabras" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Los cambios no se aplicaran hasta reiniciar." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - Visor de LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>No </b>se han encontrado coincidencias para \"<i>%s</i>\"." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "No se han encontrado coincidencias" @@ -2335,11 +2402,11 @@ msgstr "Abrir eBook" msgid "Configure" msgstr "Configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Error en la comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2347,31 +2414,31 @@ msgstr "" "<p>Para mas ayuda, visite <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Enviar a la memoria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Envia a la targeta de memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Editar metadatos individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Edita metadatos en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "añadir libros desde un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2379,7 +2446,7 @@ msgstr "" "Añadir libros de manera recursiva (un libro por directorio, asumiendo que " "cada archivo del directorio es el mismo libro en diferente formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2387,49 +2454,49 @@ msgstr "" "Añadir libros de manera recursiva (Multiples libros por directorio, " "asumiendo que cada archivo es un libro diferente)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Guardar en el disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Guardar en el disco, en un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Mostrar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Ver formato específico" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Convertir individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Convertir en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " detectado." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Conectado " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Base de datos del dispositivo corrupta" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2459,8 +2526,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2468,52 +2535,52 @@ msgstr "" "<p>Ya existen libros con el mismo título en la base de datos. ¿Añadirlo de " "todas formas?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "¡Duplicados encontrados!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "No hay espacio en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>No se pueden guardar los libros porque no hay espacio en el dispositivo " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Eliminando libros del dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "No se pueden editar los metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "No hay libros seleccionados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "No hay formatos adecuados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2521,68 +2588,68 @@ msgstr "" "No se pudieron enviar los siguientes libros al dispositivo, ya que no se " "hallaron formatos adecuados: <br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "No se puede guardar en disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Busca noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Buscando noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Noticias adquiridas. Enviando al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "No se puede convertir" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Comenzando conversión en lote de %d libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Seleccione un libro" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "No se puede visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Elija el formato para visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s no tiene formatos disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "No se puede configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "No se puede configurar con trabajos en proceso." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Copiando base de datos a " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Base de datos no valida" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2590,24 +2657,24 @@ msgstr "" "<p>Ya existe una base de datos no valida en %s, bórrela antes de intentar " "mover la base de datos existente. <br>Error: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "No se puede mover la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "No hay información detallada disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" "No hay información detallada disponible para los libros en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Error de comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2615,15 +2682,15 @@ msgstr "" "Hubo un error de comunicación con el dispositivo. Desconecte, vuelva a " "conectar el dispositivo y reinicie la aplicación." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Error de conversión" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "No existe la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2631,7 +2698,7 @@ msgstr "" "El directorio en el que se debería encontrar la base de datos, %s ya no " "existe. Por favor seleccióne una nueva ruta para la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2639,7 +2706,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Última versión: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2649,27 +2716,27 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuevas " "características</a>. Visita la página de descarga?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Actualización disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Búsqueda avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Buscar:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2677,7 +2744,7 @@ msgstr "" "Busca libros por título o autor. <br><br>Los espacios entre palabras se " "sustituyen por AND." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2685,63 +2752,73 @@ msgstr "" "Buscar libros por título, autor, editorial, etiquetas y " "comentaris<br><br>Los espacios entre parlabras se sustituyen por AND." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Reinicializar búsqueda rápida" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Añadir libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Suprimir libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Borrar" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Editar la meta-información" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Enviar al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Descargar noticias (RSS)" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Convertir Ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Añadir nueva fuente de noticias" @@ -2791,11 +2868,11 @@ msgstr "Expresión regular no válida" msgid "Invalid regular expression: %s" msgstr "Expresión regular no valida: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2803,7 +2880,7 @@ msgstr "" "Sony Reader\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2811,21 +2888,21 @@ msgstr "" "Tarjeta\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Haga click para ver la lista de libros disponibles en su ordenador" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "Haga click para ver la lista de libros disponibles en su lector" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Haga click para ver la lista de libros en la tarjeta de almacenamiento de su " "lector" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2833,7 +2910,7 @@ msgstr "" "Camino a la base de datos calibre. El valor predeterminado es a usar la ruta " "almacenada en la configuración." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2843,7 +2920,7 @@ msgstr "" "\n" "Mostrar los libros disponibles en la base de datos calibre. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2851,18 +2928,18 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Clasificar los resultados en orden ascendente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2872,15 +2949,15 @@ msgstr "" "consulta de búsqueda consulte la documentación relacionada con la búsqueda " "en el Manual del usuario. El valor predeterminado es a no hacer el filtrado." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Campos no válidos. Los campos disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Campo de clasificación no válido. Los campos disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2888,7 +2965,7 @@ msgstr "" "Los siguientes libros no se han añadido como ya existen en la base de datos " "(véase la opción --duplicates)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2903,7 +2980,7 @@ msgstr "" "directorios, consulte las opciones relacionadas a los directorios más abajo. " "\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2911,11 +2988,11 @@ msgstr "" "Supongamos que cada directorio tiene un solo libro lógico y que todos los " "archivos en este directorio son diferentes formatos de este libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Proceso de directorios recursivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2923,11 +3000,11 @@ msgstr "" "Añadir a base de datos de libros, aunque ya existen. La comparación se " "realiza sobre la base de títulos de libros." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "Debe especificar al menos un archivo para añadir" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2942,11 +3019,11 @@ msgstr "" "números de identificación utilizando el commando \"list\"). Por ejemplo, " "23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Debe especificar al menos un libro para eliminar" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2955,15 +3032,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "Debe especificar un ID y un ebook archivo" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "ebook archivo debe tener una extensión" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2980,11 +3057,81 @@ msgstr "" "archivo como LRF o TXT o EPUB. Si el libro lógico no tiene fmt disponible, " "no hacer nada.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Debe especificar un ID y un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "Usted debe especificar un ID" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "Usted debe especificar un ID y un archivo de metadatos" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" +"Exportar todos los libros en la base de datos, haciendo caso omiso de la " +"lista de identificaciones." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" +"Exportar libros para el directorio especificado. El valor por defecto es" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Exportar todos los libros en un solo directorio" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Crear nombres de archivo como autor - título en lugar de título - autor" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "Debe especificar algunas identificaciones o la opción %s" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2996,11 +3143,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Trabajo detenido por el usuario" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "No se ha podido abrir el proceso trabajador." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "No se ha podido inicializar la biblioteca fontconfig" @@ -3026,7 +3173,7 @@ msgid "Unknown feed" msgstr "Newsfeed desconocido" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artículo sin título" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 7454c5abe2..afeef93a54 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-05-24 06:22+0000\n" -"Last-Translator: FixB <Unknown>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-27 10:35+0000\n" +"Last-Translator: Pierre Slamich <pierre.slamich@gmail.com>\n" "Language-Team: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -33,6 +33,12 @@ msgstr "" #~ "Une expression régulière. Les tags <a> qui respectent cette expression " #~ "seront ignorés. Par défaut : %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Empêche l'insertion automatique d'un saut de page avant chaque chapitre " +#~ "détecté." + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -56,6 +62,9 @@ msgstr "" #~ msgid "Server error. Try again later." #~ msgstr "Erreur Serveur. Veuillez essayer ultérieurement." +#~ msgid "&Access Key;" +#~ msgstr "&Access Key;" + #~ msgid "%s is not available in LRF format. Please convert it first." #~ msgstr "%s n'est pas disponible au format LRF. Veuillez le convertir avant." @@ -164,11 +173,11 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif';\"></p></body></html>" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Créé par " @@ -191,8 +200,12 @@ msgstr "" "Par défaut : %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Inconnu" @@ -215,7 +228,7 @@ msgstr "Clé de tri pour l'auteur" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editeur" @@ -317,7 +330,7 @@ msgid "" "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:128 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 " @@ -327,23 +340,35 @@ msgstr "" "paramètres comme la résolution et la taille de l'écran du lecteur. Par " "défaut : %s Profils supportés : " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "La marge de gauche. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "La marge de droite. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "La marge de haut de page. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "La marge de bas de page. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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 <a> tags are " @@ -353,24 +378,21 @@ msgstr "" "indique qu'aucun lien ne sera traité. Une valeur négative indique que les " "tags <a> sont ignorés." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 -msgid "Don't add links to the table of contents." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Empêche l'insertion automatique d'un saut de page avant chaque chapitre " -"détecté." +msgid "Don't add links to the table of contents." +msgstr "Ne pas ajouter de liens à la table des matières." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -379,7 +401,15 @@ msgstr "" "expression rest recherchée dans les tags d'en-têtes (h1-h6). Par défaut : " "%default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -398,12 +428,12 @@ msgstr "" "page. De ce fait, cette option est ignorée si la page courante a peu " "d'éléments." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -416,16 +446,16 @@ msgstr "" "de classe \"chapter\" il faudrait saisir : \"h\\d,class,chapter\". Par " "défaut : %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." -msgstr "" +msgstr "Ajouter les chapitres détectés à la table des matières." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Préprocesse les fichiers HTML Bean pour améliorer le fichier LRF généré." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -433,12 +463,12 @@ msgstr "" "Vous devez utiliser cette option pour traiter des fichiers générés par " "pdftohtml, sinon la conversion échouera." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" "Utilisez cette option sur des fichiers html0 venant de Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -446,27 +476,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "La famille de police serif à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "La famille de police sans-serif à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "La famille de police monospace à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -475,7 +505,7 @@ msgstr "" "long. N'utilisez cette option que si vous avez des problèmes de mémoire " "disponible." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -521,105 +551,105 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" -msgstr "" +msgstr "Options pour contrôler le comportement de feeds2disk" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:24 msgid "Options to control the behavior of html2lrf" -msgstr "" +msgstr "Options pour contrôler le comportement de html2lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:46 msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /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:380 +#: /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:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" -msgstr "" +msgstr "%s est un fichier vide" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 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:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 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:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -895,19 +925,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -915,18 +945,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Commentaires" @@ -953,33 +983,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Doit être un répertoire." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Chemin de la database invalide " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Chemin de la database invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Chemin de la database invalide.<br>Erreur en écriture " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuration" @@ -994,21 +1024,21 @@ msgstr "Choisir un nouvel emplacement pour la base de données" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1092,9 +1122,9 @@ msgid "ERROR" msgstr "ERREUR" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Auteur(s)" @@ -1106,19 +1136,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Impossible de se connecter" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "Vous devez spécifier une clef d'accès valide à isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1141,8 +1175,8 @@ msgstr "" "(access key)." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Access Key;" +msgid "&Access Key:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1159,7 +1193,7 @@ msgstr "" "Sélectionnez le livre qui correspond le mieux au votre dans la liste ci-" "dessous." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -1167,6 +1201,10 @@ msgstr "" msgid "Unavailable" msgstr "Indisponible" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Exécutions en cours" @@ -1175,74 +1213,74 @@ msgstr "Exécutions en cours" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Présentation" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Mise en page" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Détection des chapitres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Aucun format disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Conversion du livre %s impossible parcequ'il ne dispose d'aucun format " "supporté" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Choix du format de conversion vers LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Conversion de %s en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Définir les paramètres par défaut de conversion" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Impossible de lire" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Vous n'avez pas les permissions nécessaires pour lire ce fichier: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Erreur à la lecture du fichier" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Il y a eu une erreur à la lecture du fichier : <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " n'est pas une image vailde" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1250,23 +1288,23 @@ msgstr "" "Pré-processe le fichier avant la conversion vers le format LRF. Ceci est " "utile si vous connaissez l'origine du fichiers. Origines connues :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> -Livres des éditions BAEN </li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - fichiers HTML générés par le programme pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" "<li><b>book-designer</b> - Fichiers HTML0 générés avec Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1274,7 +1312,7 @@ msgstr "" "Définit les metadata comme le titre et l'auteur du livre.<p>Les metadata " "seront modifiées dans la base de données et dans le fichier LRF généré." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1282,7 +1320,7 @@ msgstr "" "Ajuste la présentation du fichier LRF généré en définissant des paramètres " "tels que la taille des polices et l'espacement entre les mots." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1290,69 +1328,69 @@ msgstr "" "Définit les paramètres de la pages tels que les marges et la taille de " "l'écran du lecteur cible." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Peaufiner la détection des chapitres et des en-têtes de section." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Aucune aide n'est disponible</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Convertir en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Catégorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Options" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Couverture du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Modifie l'image &cover :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Rechercher une image à utiliser en tant que couverture du livre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Utilise l'image de couverture du fichier &source" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titre : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Modifie le titre du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Auteurs : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1360,30 +1398,30 @@ msgstr "" "Modifie les auteurs du livres. Si plusieurs auteurs, les séparer avec des " "virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "T&ri de l'auteur :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editeur : " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Modifie l'éditeur du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Ta&gs : " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1391,183 +1429,195 @@ msgstr "" "Tags caractérisant le livre, particulièrement utile pour la recherche. <br> " "<br> Cela peut être n'importe quels mots, séparés par des virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Séries :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Liste de séries connues. Vous pouvez ajouter de nouvelles séries." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Index de séries" -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Livre " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Taille de &police par défaut :" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Polices inclues" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /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:541 msgid "&Word spacing:" msgstr "Espacement entre &mots :" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Active l'auto &rotation des images" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Insère des lignes &blanches entre les paragraphes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignore les &tables" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocess :" -#: /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:548 msgid "Header" msgstr "En-têtre" -#: /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:549 msgid "&Show header" msgstr "&Affiche l'en-tête" -#: /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:550 msgid "&Header format:" msgstr "Format de l'&en-tête" -#: /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:551 msgid "Override<br>CSS" msgstr "Surcharge <br> CSS" -#: /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:552 msgid "&Profile:" msgstr "&Profil :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Marge &Gauche :" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /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:555 msgid "&Right Margin:" msgstr "Marge &Droite :" -#: /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:557 msgid "&Top Margin:" msgstr "Marge &Haute :" -#: /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:559 msgid "&Bottom Margin:" msgstr "Marge &Basse :" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Détection basée sur les titres" -#: /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:564 msgid "&Disable chapter detection" msgstr "&Désactive la détection de chapitres" -#: /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:565 msgid "&Regular expression:" msgstr "Expression &Régulière :" -#: /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:566 msgid "Add &chapters to table of contents" 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:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Détection basée sur des tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "Saut de &page avant le tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Force un saut de page avant le tag:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Force un saut de page avant l'&attribut :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Aide" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1578,17 +1628,17 @@ msgid "Edit Meta information" msgstr "Editer les informations Metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Informations (metadata)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "Clé de tr&i de l'auteur : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1597,19 +1647,19 @@ msgstr "" "Dickens peut être classé comme Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Note :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Note de ce livre. de 0 à 5 étoiles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " étoiles" @@ -1651,51 +1701,51 @@ msgstr "Erreur à la récupération de l'image de couverture" msgid "You must specify the ISBN identifier for this book." msgstr "Vous devez fournir l'identifiant ISBN de ce livre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Edition des metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Ouvre l'éditeur de mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "I&SBN :" -#: /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:284 msgid "Fetch metadata from server" msgstr "Récupération des metadata depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Formats disponibles" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Ajout d'un nouveau format dans la base de données pour ce livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Retire les formats sélectionnés de ce livre de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Récupération de l'image de couverture depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Modifie le nom d'utilisateur et/ou le mot de passe de votre compte à " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Modifie le mot de passe" @@ -1724,13 +1774,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Séries" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1761,39 +1811,39 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editeur de Mots-Clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Mots-clefs disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1801,29 +1851,29 @@ msgstr "" "Supprime un mot-clef de la base de données. Cette opération va retirer ce " "mot-clef de tous les livres et le supprimer de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Applique le mot-clef au livre en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Enlève le mot-clef du livre en cours" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Ajoute mot-clef" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Ajoute le mot-clef à la liste des mots-clefs et l'applique au livre en cours" @@ -1841,95 +1891,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1943,62 +1993,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -2077,106 +2127,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Travaux" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Statut" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progression" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "En attente" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "En cours" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Aucun" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tags" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formats" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Livre <font face=\"serif\">%s</font> of %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Taille (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Date" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Note" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Chemin" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Horodatage" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -2198,15 +2248,15 @@ msgstr "" "<b>Les modifications ne seront prises en compte qu'après avoir relancé le " "programme." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Aucun résultat</b> pour la recherche <i>%s</i>." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Aucun résultat" @@ -2250,95 +2300,95 @@ msgstr "Ouvrir le livre" msgid "Configure" msgstr "Configuration" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Envoi vers la mémoire du lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Envoi vers la carte mémoire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Edition des metadata individuellement" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Edition des metadata par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Convertion individuelle" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Convertion par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2354,8 +2404,8 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2363,120 +2413,120 @@ msgstr "" "<p>Des livres ayant le même titre existent déjà dans la base de données. Les " "ajouter quand même ?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Des doublons ont été détectés !" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Impossible d'envoyer les livres sur le lecteur : il n'y a plus assez " "d'espace mémoire disponible " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Erreur à l'édition des metadat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Ne peut pas enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Conversion impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Impossible de visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Configuration impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Impossible de configurer pendant que des travaux sont en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Base de données invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2484,23 +2534,23 @@ msgstr "" "<p>Une base de données invalide existe déjà ici : %s, spprimez la avant " "d'essayer de déplacer la base de données existante.<br>Erreur : %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Déplacement de la base de données impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2509,54 +2559,54 @@ msgstr "" "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "électronique et redémarrer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Recherche :" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2564,7 +2614,7 @@ msgstr "" "Recherche les livres par titre ou auteur <br><br>Recherche en ET pour les " "mots séparés par des espaces." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2572,63 +2622,73 @@ msgstr "" "Recherche les livres par titre, auteur, éditeur, tags et commentaires " "<br><br>Recherche en ET pour les mots séparés par des espaces." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Réinitialisation de la recherche rapide" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Ajout d'un livre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Suppression du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Suppression" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Edition des metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Envoyer au lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Récupérer des News" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Convertir des ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2673,11 +2733,11 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Librairie" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2685,7 +2745,7 @@ msgstr "" "Lecteur \n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2693,32 +2753,32 @@ msgstr "" "Carte\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2726,39 +2786,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2767,27 +2827,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2796,11 +2856,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2809,15 +2869,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2827,11 +2887,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2843,11 +2969,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2873,7 +2999,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 445a32c0e7..48cd3767cf 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-12 22:40+0000\n" -"Last-Translator: S. Dorscht <Unknown>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 20:27+0000\n" +"Last-Translator: Iacopo Benesperi <Unknown>\n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -36,6 +36,12 @@ msgstr "" #~ "Un'espressione regolare. I tag <a> i cui href corrispondono verranno " #~ "ignorati. Predefinita: %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Previene l'inserimento automatico di interruzioni di pagina prima dei " +#~ "capitoli individuati" + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -60,6 +66,12 @@ msgstr "" #~ msgid "The author whoose book to search for." #~ msgstr "L'autore del libro da cercare" +#~ msgid "&Access Key;" +#~ msgstr "&Chiave d'accesso;" + +#~ msgid "Job killed by user" +#~ msgstr "Lavoro terminato dall'utente" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -67,11 +79,34 @@ msgstr "" #~ "Salvare il testo sottostante in un file di nome recipe.py e mandaro ai " #~ "propri amici, in modo da permettergli di usare questa formula." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Creato da " @@ -94,8 +129,12 @@ msgstr "" "Predefinito: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Sconosciuto" @@ -118,7 +157,7 @@ msgstr "Chiave per la classificazione dell'autore" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editore" @@ -230,7 +269,7 @@ msgstr "" "Trasforma tutto il contenuto in bianco e nero al posto dei colori " "specificati dall'HTML o dal CSS." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 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 " @@ -240,23 +279,39 @@ msgstr "" "determina parametri come la risoluzione e la dimensione dello schermo del " "dispositivo. Predefinito: %s. Profili supportati: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Margine sinistro della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Margine destro della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Margine superiore della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Margine inferiore della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" +"Trasforma in immagini le tabelle di HTML (utile se il documento ha tabelle " +"grandi o complesse)" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" +"Moltiplica la dimensione del testo nelle tabelle trasformate di questo " +"fattore. Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 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 <a> tags are " @@ -266,7 +321,7 @@ msgstr "" "0 significa che i link non vengono seguiti. Un valore negativo significa che " "i tag <a> vengono ignorati" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -274,18 +329,15 @@ msgstr "" "Un'espressione regolare. I tag <a> i cui href corrispondono verranno " "ignorati. Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Non aggiungere link al sommario." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Previene l'inserimento automatico di interruzioni di pagina prima dei " -"capitoli individuati" - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Previene l'individuazione automatica dei capitoli." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -293,7 +345,20 @@ msgstr "" "L'espressione regolare utilizzata per individuare i titoli dei capitoli. I " "titoli vengono cercati nei tag d'intestazione (H1-H6). Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" +"Individua l'inizio di un capitolo con un tag che ha l'attributo specificato. " +"Il formato di questa opzione è regexp nome tag,nome attributo,regexp valore " +"attributo. Ad esempio per far corrispondere tutti i tag di intestazione che " +"hanno l'attributo class=\"capitolo\", bisogna usare \"h\\d,class,capitolo\". " +"Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -312,14 +377,14 @@ msgstr "" "degradano le prestazioni dell'LRF nel girare la pagina. Questa opzione viene " "perciò ignorata se la pagina corrente ha solo pochi elementi" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Forza un'interruzione di pagina prima dei tag i cui nomi corrispondono a " "questa espressione regolare" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -332,15 +397,15 @@ msgstr "" "tutti i tag intestazione che hanno l'attributo class=\"chapter\" bisogna " "usare \"h\\d,class,chapter\". Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "Aggiungi i capitoli individuati al sommario." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "Preprocessa i file HTML di Baen per migliorare i file LRF generati" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -348,11 +413,11 @@ msgstr "" "È necessario aggiungere questa opzione se si stanno processando file " "generati da pdftohtml, altrimenti la conversione non riuscirà" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Usare questa opzione sui file html0 di Book Designer" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -365,27 +430,27 @@ msgstr "" "nel girare le pagine. Ad esempio: --serif-family \"Times New Roman\"\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "La famiglia di caratteri con grazie da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "La famiglia di caratteri senza grazie da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "La famiglia di caratteri a spaziatura fissa da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Prolisso durante il processamento" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Converte in LRS" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -393,7 +458,7 @@ msgstr "" "Minimizza l'uso di memoria al costo di un maggior tempo di processamento. " "Usare questa opzione se si è su una macchina a corto di memoria" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -467,56 +532,56 @@ msgstr "Opzioni per controllare il comportamento di html2lrf" msgid "Fetching of recipe failed: " msgstr "Scaricamento della formula fallito: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tFile di Book Designer individuato" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalisi HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tFile di Baen individuato. Rianalizzo..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "HTML preprocessato scritto in " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Sto processando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConversione in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Impossibile analizzare il file: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%S è un file vuoto" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Analisi fallita del link %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Impossibile aggiungere il link %s alla TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Impossibile processare l'immagine %s. Errore: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Impossibile processare la PNG interlacciata %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -524,14 +589,14 @@ msgstr "" "Impossibile processare l'immagine: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Si è verificato un errore nel processamento della tabella: %s. Ignoro il " "codice della tabella" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -539,11 +604,11 @@ msgstr "" "Tabella malformata:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "La tabella ha celle troppo larghe" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -551,19 +616,19 @@ msgstr "" "È necessario prima salvare il sito web %s come un file HTML e poi eseguire " "html2lrf su di esso" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Impossibile leggere l'immagine di copertina: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Impossibile leggere da: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Processamento del file OPF fallito" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -603,7 +668,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:133 msgid "Output LRS file" -msgstr "Estrae un file LRS" +msgstr "Restituisce un file LRS" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:151 msgid "Parsing LRF..." @@ -897,19 +962,19 @@ msgstr "Uso: pdf-meta-file.pdf" msgid "No filename specified." msgstr "Nessun nome file specificato" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opzioni] miolibro.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Cartella in uscita. Predefinita: cartella corrente" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "MOBI HTML raw salvato in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "Libro OEB creato in" @@ -917,18 +982,18 @@ msgstr "Libro OEB creato in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titolo" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Commenti" @@ -955,33 +1020,33 @@ msgstr "Base" msgid "Advanced" msgstr "Avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Deve essere una cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Percorso database non valido " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Percorso database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Percorso database non valido.<br>Impossibile scrivere su " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Compattamento database. Poterbbe richiedere un po' di tempo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Compattamento..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configurazione" @@ -996,21 +1061,21 @@ msgstr "Sfoglia per specificare una nuova posizione del database" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1095,9 +1160,9 @@ msgid "ERROR" msgstr "ERRORE" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autore(i)" @@ -1109,20 +1174,24 @@ msgstr "Classificazione autore" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Impossibile connettersi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" "È necessario specificare delle chiavi d'accesso valide per isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Errore nello scaricamento dei metadati" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Messun metadato trovato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1147,8 +1216,8 @@ msgstr "" "d'accesso." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Chiave d'accesso;" +msgid "&Access Key:" +msgstr "&Chiave d'accesso:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1165,7 +1234,7 @@ msgstr "" "Selezionare il libro che corrisponde maggiormente alla propria copia " "dall'elenco sottostante" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Dettagli del lavoro" @@ -1173,6 +1242,10 @@ msgstr "Dettagli del lavoro" msgid "Unavailable" msgstr "Non disponibile" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - Lavori" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Lavori attivi" @@ -1181,73 +1254,73 @@ msgstr "Lavori attivi" msgid "&Stop selected job" msgstr "I&nterrompi il lavoro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Visualizzazione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Imposta pagina" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Individuazione capitoli" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Nessun formato disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Impossibile convertire %s perché questo libro non ha formati supportati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Scegliere il formato da convertire in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Converte %s in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Impostazioni di conversione predefinite" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Impossibile leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Non si hanno i permessi per leggere il file: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Errore nella lettura del file" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Si è verificato un errore nella lettura del file: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " non è un'immagine valida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1255,22 +1328,22 @@ msgstr "" "Preprocessa il file prima di convertirlo in LRF. È utile se si conosce la " "fonte da cui proviene il file. Fonti conosciute:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Libri dall'editore BAEN</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - File HTML generati dal programma pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - File HTML0 da Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1278,7 +1351,7 @@ msgstr "" "Specifica metadati come il titolo e l'autore del libro.<p>I metadati saranno " "aggiornati nel database e nel file LRF generato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1286,7 +1359,7 @@ msgstr "" "Aggiusta la visualizzazione del file LRF generato specificando parametri " "come la dimensione dei caratteri e la spaziatura tra le parole" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1294,72 +1367,72 @@ msgstr "" "Specifica le impostazioni della pagina come i margini e la dimensione dello " "schermo del dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" "Mette a punto in modo fine l'individuazione delle intestazioni dei capitoli " "e delle sezioni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Nessun aiuto disponibile</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Conversione in gruppo di libri in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Converti in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categoria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opzioni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Copertina del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Ca&mbia l'immagine di copertina:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" "Sfoglia per trovare un'immagine da usare come copertina per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Usa copertina del file di &origine" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titolo: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Cambia il titolo di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "A&utore(i): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1367,30 +1440,30 @@ msgstr "" "Cambia l'autore di questo libro. Autori multipli devono essere separati da " "una virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "Classifica&zione autore:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editore: " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Cambia l'editore di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "T&ag: " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1399,183 +1472,196 @@ msgstr "" "ricerche. <br>Possono essere qualsiasi parola o frase, separati da una " "virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Serie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Lista di serie conosciute. È possibile aggiungere nuove serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Indice serie" -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Libro " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "&Grandezza caratteri di base:" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Caratteri inclusi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Con grazie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "&Senza grazie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Dimensione fissa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "C&odifica sorgente:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "I&ndentazione minima:" -#: /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:541 msgid "&Word spacing:" msgstr "Spaziat&ura caratteri:" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Abilita &rotazione automatica delle immagini" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Ins&erisci linee bianche tra i paragrafi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignora ta&belle" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Ignor&a colori" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocessamento:" -#: /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:548 msgid "Header" msgstr "Intestazione" -#: /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:549 msgid "&Show header" msgstr "&Mostra intestazione" -#: /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:550 msgid "&Header format:" msgstr "&Formato intestazione:" -#: /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:551 msgid "Override<br>CSS" msgstr "Sovrascrivi<br>CSS" -#: /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:552 msgid "&Profile:" msgstr "&Profilo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margine &sinistro:" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /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:555 msgid "&Right Margin:" msgstr "Margine &destro:" -#: /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:557 msgid "&Top Margin:" msgstr "Margine s&uperiore:" -#: /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:559 msgid "&Bottom Margin:" msgstr "Margine i&nferiore:" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "&Converti tabelle in immagini (utile per tabelle grandi/complesse)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" +"&Moltiplicatore per la dimensione del testo nelle tabelle trasformate:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Individuazione basata sul titolo" -#: /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:564 msgid "&Disable chapter detection" msgstr "&Disabilita l'individuazione del capitoli" -#: /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:565 msgid "&Regular expression:" msgstr "&Espressione regolare:" -#: /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:566 msgid "Add &chapters to table of contents" msgstr "Aggiungi i &capitoli al sommario" -#: /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:567 msgid "Don't add &links to the table of contents" msgstr "Non aggiungere li&nk al sommario" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Individuazione basata sui tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "I&nterruzione di pagina prima del tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Forza interruzione di pagina prima del tag:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Forza interruzione di pagina prima dell'&attributo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "Indi&vidua capitolo col tag:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Aiuto per l'elemento" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1585,8 +1671,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1596,17 +1682,17 @@ msgid "Edit Meta information" msgstr "Modifica metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "&Classificazione autore: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1615,19 +1701,19 @@ msgstr "" "esempio, Charles Dickens deve essere classificato come Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Giudizio:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Giudizio su questo libro. 0-5 stelle" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " stelle" @@ -1669,50 +1755,50 @@ msgstr "Impossibile scaricare la copertina" msgid "You must specify the ISBN identifier for this book." msgstr "È necessario specificare il codice ISBN di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Modifica metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Apri l'editor dei tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Rimuovi serie inutilizzate (che non hanno libri)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Scarica metadati dal server" -#: /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:285 msgid "Available Formats" msgstr "Formati disponibili" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Aggiungi un nuovo formato al database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Rimuovi il formato selezionato dal database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Scarica immagine di copertina dal server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Cambia il nome utente e/o password del proprio account su LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Cambia password" @@ -1741,13 +1827,13 @@ msgid "Tag" msgstr "Tag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formato" @@ -1780,39 +1866,39 @@ msgstr "" msgid "Negate" msgstr "Nega" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Ricerca avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "&Corrispondenza con tutti i criteri seguenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "C&orrispondenza con uno qualunque dei criteri seguenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Criteri di ricerca" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Di più" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Meno" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editor di tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Tag &disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1820,23 +1906,23 @@ msgstr "" "Rimuovi il tag dal database. Questa operazione rimuoverà il tag da tutti i " "libri e poi dal database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Applica il tag al libro corrente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "&Tag applicati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Rimuovi il tag dal libro corrente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "&Aggiungi tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1844,7 +1930,7 @@ msgstr "" "Se il tag voluto non è nella lista di quelli disponibili, è possibile " "aggiungerlo qui. Accetta una lista di tag separati da virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "Aggiungi il tag a quelli disponibili e applicalo al libro corrente" @@ -1861,95 +1947,95 @@ msgid "Recipe for " msgstr "Formula per " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "Passa alla modalità avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Passa alla modalità base" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Il feed deve avere un titolo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Il feed deve avere un titolo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Il feed deve avere una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "Il feed %S deve avere una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Esiste già" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Questo feed è già stato aggiunto alla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Input non valido" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Input non valido" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Impossibile creare la formula. Errore:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Sovrascrivere la formula?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "Esiste già una formula personalizzata di nome %s. Sovrascriverla?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Scegliere un file di formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Formule" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Aggiungi una fonte di notizie personalizzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Formule utente disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Aggiungi/Aggiorna for&mula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Rimuovi formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "Condi&vidi formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "Carica formula &da file" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1973,56 +2059,56 @@ msgstr "" "parte dei feed, bisognerà usare la \"Modalità avanzata\" per personalizzare " "ulteriormente il processo di scaricamento.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Titolo formula:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "Arti&colo più vecchio:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "L'articolo più vecchio da scaricare" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " giorni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Numero massimo di articoli per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Massimo numero di articoli da scaricare per feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feed nella formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Rimuove il feed dalla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Aggiunge il feed alla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "Tit&olo del feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "&URL del feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "&Aggiungi feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2031,7 +2117,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Formule " "utente</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Codice sorgente formula (python)" @@ -2116,45 +2202,45 @@ msgstr "Nome del gruppo per l'espressione regolare (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Lavoro" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Stato" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progresso" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Tempo di esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Errore" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Finito" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "In attesa" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "In esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "Impossibile terminare il lavoro" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2162,62 +2248,62 @@ msgstr "" "Impossibile terminare i lavori che stanno comunicando col dispositivo dato " "che potrebbe causare una corruzione dei dati" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Impossibile terminare i lavori già completati" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Impossibile terminare i lavori in attesa" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Nessuno" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tag" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formati" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Libro <font face=\"serif\">%s</font> di %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doppio clic per modificarmi" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Dimensione (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Data" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Giudizio" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Percorso" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Timestamp" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Cerca (Per la ricerca avanzata fare clic sul bottone a sinistra)" @@ -2237,15 +2323,15 @@ msgstr "Unisci" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Le modifiche avranno effetto dopo il riavvio" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - Lettore LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Nessuna corrispondenza</b> trovata per la frase <i>%s</i>" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Nessuna corrispondenza trovata" @@ -2289,11 +2375,11 @@ msgstr "Apri libro" msgid "Configure" msgstr "Configurazione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2301,31 +2387,31 @@ msgstr "" "<p>Per aiuto visitare <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s di <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Invia alla memoria principale" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Invia alla scheda di memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Modifica metadati individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Modifica metadati in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Aggiungi libri da una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2333,7 +2419,7 @@ msgstr "" "Aggiungi libri ricorsivamente (un libro per cartella, assume che ogni file " "sia lo stesso libro in un diverso formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2341,49 +2427,49 @@ msgstr "" "Aggiungi libri ricorsivamente (più libri per cartella, assume che ogni file " "sia un libro diverso)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Salva su disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Salva su disco in una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Leggi" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Leggi uno specifico formato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Converti individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Converti in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " individuato." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Connesso " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Database del dispositivo corrotto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2412,8 +2498,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2421,53 +2507,53 @@ msgstr "" "<p>Nel database sono già presenti libri con i seguenti titoli. Aggiungerli " "ugualmente?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Scoperti duplicati!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Caricamento libri nel dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Spazio insufficiente sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Impossibile salvare libri sul dispositivo perché non c'è più spazio " "disponibile " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Cancellamento libri dal dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Impossibile modificare i metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Invio libri al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Nessun formato adatto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2475,68 +2561,68 @@ msgstr "" "Impossibile caricare i seguenti libri nel dispositivo, perché non è stato " "trovato nessun formato adatto:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Impossibile salvare sul disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Scarica notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Scaricamento notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Notizie scaricate. Salvataggio sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Impossibile convertire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Avviamento conversione in gruppo di %d libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Impossibile leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Scegliere il formato da leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s non ha formati disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Impossibile configurare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Impossibile configurare mentre ci sono lavori in esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Copiatura database in " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2544,25 +2630,25 @@ msgstr "" "<p>Esiste già un database non valido in %s, eliminarlo prima di provare a " "spostare il database esistente.<br>Errore: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Impossibile spostare il database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Nessuna informazione dettagliata disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" "Non è disponibile alcuna informazione dettagliata per i libri nel " "dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2570,15 +2656,15 @@ msgstr "" "Si è verificato un errore di comunicazione temporaneo col dispositivo. " "Disconnettere e riconnettere il dispositivo e/o riavviare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Errore di conversione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "Il database non esiste" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2586,7 +2672,7 @@ msgstr "" "La cartella in cui il database dovrebbe essere: %s non esiste più. Scegliere " "una nuova posizione per il database." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2594,7 +2680,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Ultima versione: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2604,27 +2690,27 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuove " "funzionalità</a>. Una visita alla pagina del download?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Aggiornamento disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Ricerca avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Cerca:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2632,7 +2718,7 @@ msgstr "" "Cerca nella lista dei libri per titolo o autore<br><br>Parole separate da " "spazi hanno come operatore AND" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2640,63 +2726,75 @@ msgstr "" "Cerca nella lista dei libri per titolo, autore, editore, tag e " "commenti<br><br>Parole separate da spazi hanno come operatore AND" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Resetta ricerca veloce" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Aggiungi libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Rimuovi libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Canc" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Modifica metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Invia al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Scarica notizie" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Converti libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" +"Redireziona l'output della console a una finestra di dialogo (sia stdout ceh " +"stderr). Utile nelle finestre dove l'applicazione GUI non ha un output." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "ERRORE: eccezione non gestita" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Aggiungi una fonte di notizie personalizzata" @@ -2746,11 +2844,11 @@ msgstr "Espressione regolare non valida" msgid "Invalid regular expression: %s" msgstr "Espressione regolare non valida: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2758,7 +2856,7 @@ msgstr "" "Lettore\n" "%s disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2766,24 +2864,24 @@ msgstr "" "Scheda\n" "%s disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" "Fare clic per vedere la lista di libri disponibili sul proprio computer" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Fare clic per vedere la lista di libri nella memoria principale del proprio " "lettore" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Fare clic per vedere la lista di libri nella scheda di memoria del proprio " "lettore" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2791,7 +2889,7 @@ msgstr "" "Percorso al database di calibre. L'opzione predefinita è quella di usare il " "percorso salvato nelle opzioni." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2801,7 +2899,7 @@ msgstr "" "\n" "Mostra un elenco dei libri disponibili nel database di calibre. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2813,7 +2911,7 @@ msgstr "" "Campi disponibili: %s\n" "Predefinito: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2823,11 +2921,11 @@ msgstr "" "Campi disponibili: %s\n" "Predefinito: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Ordina i risultati in ordine crescente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2837,15 +2935,15 @@ msgstr "" "documentazione relativa alla ricerca nel Manuale Utente. L'opzione " "predefinita è quella di non filtrare." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Campi non validi. Campi disponibili:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Campo per l'ordinamento non valido. Campi disponibili:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2853,7 +2951,7 @@ msgstr "" "I seguenti libri non sono stati aggiunti perché già esistenti nel database " "(vedere l'opzione --duplicates):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2867,7 +2965,7 @@ msgstr "" "cartelle, leggere\n" "le opzioni dedicate alle cartelle in basso. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2875,21 +2973,21 @@ msgstr "" "Assume che ogni cartella abbia un solo libro logico e che tutti i file " "presenti siano diversi formati per quel libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Processa cartelle ricorsivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "Aggiunge libri al database anche se esistono già." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "È necessario specificare almeno un file da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2903,11 +3001,11 @@ msgstr "" "separata da virgole di numeri id (è possibile ottenere i numeri id usando il " "comando list). Ad esempio: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "È necessario specificare almeno un libro da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2921,15 +3019,15 @@ msgstr "" "identificato da id. È possibile ottenere gli id usando il comando list. Se " "il formato esiste già, verrà sovrascritto.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "È necessario specificare un id e un file ebook" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "I file ebook devono avere un'estensione" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2946,11 +3044,102 @@ msgstr "" "file come LRF, TXT o EPUB. Se il libro logico non ha un fmt disponibile, non " "fa niente.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "È necessario specificare un id e un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metedata [opzioni] id\n" +"\n" +"Mostra i metedati salvati nel database di calibre per il libro identificato " +"da id. \n" +"id è un numero id dalla lista dei comandi. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Stampa i metafati in formato OPF (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "È necessario specificare un id" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" +"\n" +"%prog set_metadata [opzioni] id /percorso/a/metadati.opf\n" +"\n" +"Imposta i metadati salvati nel database di calibre per il libro identificato " +"da id\n" +"presi dal file OPF metadati.opf. id è un numero id dalla lista dei comandi. " +"È \n" +"possibile farsi un'idea generale del formato OPF usando il parametro --as-" +"opf\n" +"nel comando show_metadata.\n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "È necessario specificare un id e un file di metadati" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" +"%prog export [opzioni] id \n" +"\n" +"Esporta i libri specificati da id (lista separata da virgole) nel " +"filesystem.\n" +"L'operazione di esportazione salva tutti i formati del libro, la sua " +"copertina\n" +"e i metadati (in un file opf). È possibile prendere i dumeri di id dalla " +"lista dei comandi. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "Esporta tutti i libri del database, ignorando la lista di id." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "Esporta i libri nella cartella specificata. Predefinita:" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Esporta tutti i libri in una singola cartell" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Crea i nomi dei file come \"autore - titolo\" invece di \"titolo - autore\"" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "È necessario specificare qualche id o l'opzione %s" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2966,11 +3155,11 @@ msgstr "" " \n" "Per aiuto su un singolo comando: %%prog comando --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Lavoro terminato dall'utente" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "Impossibile avviare il gestore dei lavori." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "Impossibile inizializzare la libreria fontconfig" @@ -2996,7 +3185,7 @@ msgid "Unknown feed" msgstr "Feed sconosciuto" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Articolo senza titolo" diff --git a/src/calibre/translations/nds.po b/src/calibre/translations/nds.po index 9e837a78bd..b98a5ffddb 100644 --- a/src/calibre/translations/nds.po +++ b/src/calibre/translations/nds.po @@ -5,16 +5,16 @@ # Kovid Goyal <kovid@kovidgoyal.net>, 2007, 2008. msgid "" msgstr "" -"Project-Id-Version: nds\n" +"Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-12 22:39+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 17:18+0000\n" "Last-Translator: S. Dorscht <Unknown>\n" -"Language-Team: nds\n" +"Language-Team: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -52,6 +52,12 @@ msgstr "" #~ msgid "The author whoose book to search for." #~ msgstr "Der Autor des gesuchten Buches." +#~ msgid "&Access Key;" +#~ msgstr "&Zugriffsschlüssel:" + +#~ msgid "Job killed by user" +#~ msgstr "Auftrag durch Benutzer abgebrochen" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -59,11 +65,34 @@ msgstr "" #~ "Speichern Sie den unten stehenden Text als Rezept.py Datei und senden Sie " #~ "die Datei an Freunde, damit sie dieses Rezept ebenfalls benutzen können." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sBenutzung%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Erstellt von " @@ -71,7 +100,7 @@ msgstr "Erstellt von " #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 msgid "Unable to detect the %s disk drive. Try rebooting." -msgstr "Konnte das %s Laufwerk nicht finden. Neustart versuchen." +msgstr "Konnte das Laufwerk %s nicht finden. Versuchen Sie einen Neustart." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 msgid "Set the title. Default: filename." @@ -86,8 +115,12 @@ msgstr "" "angegeben werden. Voreinstellung: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Unbekannt" @@ -110,7 +143,7 @@ msgstr "Sortierung nach Autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Herausgeber" @@ -169,7 +202,7 @@ msgstr "Paragraphen durch Leerzeilen trennen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:107 msgid "Add a header to all the pages with title and author." -msgstr "Kopfzeile mit Titel und Autornamen für alle Seiten einfügen." +msgstr "Kopfzeile mit Titel und Autor für alle Seiten einfügen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:109 msgid "" @@ -222,7 +255,7 @@ msgid "" msgstr "" "Inhalt schwarz-weiß rendern anstatt in den in HTML oder CSS angegeben Farben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 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 " @@ -232,23 +265,39 @@ msgstr "" "unter anderem die Auflösung und die Bildschirmgröße des Zielgerätes fest. " "Voreinstellung: %s Unterstützte Profile: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Linker Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Rechter Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Oberer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Unterer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" +"Tabellen in HTML als Bilder rendern (hilfreich, wenn das Dokument große oder " +"komplexe Tabellen enthält)" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" +"Textgröße in gerenderten Tabellen um diesen Faktor erhöhen. Voreinstellung " +"ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 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 <a> tags are " @@ -258,26 +307,23 @@ msgstr "" "dass Verknüpfungen ignoriert werden. Ein negativer Wert bedeutet, dass alle " "<a> Elemente ignoriert werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -"Ein regulärer Ausdruck. <a> tags, deren Verknüpfungen ignoriert werden. " +"Ein regulärer Ausdruck. <a> Elemente, deren Verknüpfungen ignoriert werden. " "Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Keine Links zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Automatisches Einfügen von Seitenumbrüchen vor ermittelten Kapiteln " -"verhindern." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Automatische Erkennung von Kapiteln verhindern." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -285,7 +331,20 @@ msgstr "" "Der reguläre Ausdruck zur Ermittlung von Kapitelüberschriften. Es wird nach " "mit (h1) - (h6) angegebenen Überschriften gesucht. Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" +"Erkenne einen Kapitelanfang anhand des Elements mit dem angegebenen " +"Attribut. Das Format dieser Option ist tagname regexp,attribute " +"name,attribute value regexp. Um zum Beispiel alle \"header\" (\"h\") " +"Elemente mit dem Attribut class=\"chapter\" anzugleich, müsste man \"h\\" +"d,class,chapter\" benutzen. Voreinstellung ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -304,14 +363,14 @@ msgstr "" "Umblättern der in der LRF Datei verlangsamt. Diese Einstellung wird " "ignoriert, wenn die aktuelle Seite nur wenige Elemente enthält." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Seitenumbruch erzwingen vor Elementen, deren Namen diesem regulären Ausdruck " "entsprechen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -324,16 +383,16 @@ msgstr "" "class=\"chapter\" anzupassen, verwenden Sie \"h\\d,class,chapter\". " "Voreinstellung ist %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." -msgstr "Ermittelte Kapitel zum Inhaltsverzeichnis hinzufügen." +msgstr "Die ermittelten Kapitel zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Baen HTML Dateien vorbearbeiten, um die erstellte LRF Datei zu verbessern." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -341,11 +400,11 @@ msgstr "" "Sie müssen diese Auswahl treffen, wenn sie Dateien, die von pdftohtml " "erstellt wurden, verarbeiten wollen, sonst schlägt die Konvertierung fehl." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Benutzen Sie diese Einstellung bei HTML Dateien von Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -359,27 +418,27 @@ msgstr "" "angegeben: --serif-family \"Times New Roman\"\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "Serife Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "Serifenlose Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "Nichtproportionale Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Zu LRS konvertieren" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -388,7 +447,7 @@ msgstr "" "Benutzen Sie diese Einstellung, wenn sie an einem Rechner mit geringem " "Hauptspeicher arbeiten." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -446,7 +505,7 @@ msgstr "" "%prog [options] dateiname.fb2\n" "\n" "\n" -"%prog ckonvertiert dateiname.fb2 in dateiname.lrf" +"%prog konvertiert dateiname.fb2 in dateiname.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 @@ -465,56 +524,56 @@ msgstr "Einstellungen für html2lrf" msgid "Fetching of recipe failed: " msgstr "Abruf des Rezepts misslungen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer Datei erkannt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalysiere HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen Datei erkannt. Analysiere erneut..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "Vorverarbeitetes HTML gespeichert unter " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Verarbeite %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tKonvertiere in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Konnte Datei nicht analysieren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s ist eine leere Datei" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Fehlschlag bei der Analysierung von %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Konnte Link %s nicht zu TOC hinzufügen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Konnte Bild %s nicht verarbeiten. Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Konnte verschachteltes PNG %s nicht verarbeiten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -522,14 +581,14 @@ msgstr "" "Konnte Bild nicht verarbeiten: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ein Fehler trat während der Bearbeitung einer Tabelle auf: %s. " "Tabellenformat wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -537,11 +596,11 @@ msgstr "" "Schlechte Tabelle:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "Tabelle enthält Zelle, die zu groß ist" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -549,19 +608,19 @@ msgstr "" "Sichern Sie die Website %s zuerst als HTML Datei und benutzen Sie dann " "html2lrf mit der gespeicherten HTML Datei." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Konnte Umschlagbild nicht lesen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Lesen nicht möglich von: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Verarbeitung der OPF Datei schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -898,19 +957,19 @@ msgstr "Benutzung: pdf-meta dateiname.pdf" msgid "No filename specified." msgstr "Kein Dateiname angegeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [options] dateiname.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "Original MOBI HTML gespeichert in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "OEB eBook erstellt in" @@ -918,18 +977,18 @@ msgstr "OEB eBook erstellt in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Bemerkung" @@ -956,33 +1015,33 @@ msgstr "Einfach" msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.<br>Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." -msgstr "Verdichte Datenbank. Das kann dauern..." +msgstr "Komprimiere Datenbank. Das kann etwas dauern..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." -msgstr "Verdichte Datenbank..." +msgstr "Komprimiere Datenbank..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Konfiguration" @@ -997,21 +1056,21 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1075,7 +1134,7 @@ msgstr "Klein" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 msgid "&Button size in toolbar" -msgstr "&Button Größe in der Symbolleiste" +msgstr "&Größe der Schaltflächen in der Symbolleiste" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 msgid "Show &text in toolbar buttons" @@ -1087,7 +1146,7 @@ msgstr "Freier unbenutzter Festplattenspeicher der Datenbank" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Compact database" -msgstr "Datenbank verdi&chten" +msgstr "Datenbank &komprimieren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "&Metadata from file name" @@ -1098,9 +1157,9 @@ msgid "ERROR" msgstr "FEHLER" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autor(en)" @@ -1112,21 +1171,25 @@ msgstr "Sortierung nach Autor" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Verbindung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" "Sie müssen einen gültigen Zugangsschlüssel (access key) für isbndb.com " "angeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Fehler beim Abrufen der Meta-Daten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Keine Meta-Daten gefunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1151,8 +1214,8 @@ msgstr "" "erhalten." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Zugriffsschlüssel:" +msgid "&Access Key:" +msgstr "Zug&angsschlüssel:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1169,7 +1232,7 @@ msgstr "" "Wählen Sie aus der unten stehenden Liste das Buch, das Ihrer Ausgabe " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Details des Auftrags" @@ -1177,6 +1240,10 @@ msgstr "Details des Auftrags" msgid "Unavailable" msgstr "Nicht verfügbar" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - Aufträge" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Aktive Aufträge" @@ -1185,74 +1252,74 @@ msgstr "Aktive Aufträge" msgid "&Stop selected job" msgstr "Ausgewählten Auftrag &stoppen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Meta-Daten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Look & Feel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Seiteneinrichtung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Ermittlung der Kapitel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Keine verfügbaren Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Kann %s nicht konvertieren, da dieses Buch nicht den bekannten Formaten " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Wählen Sie das Format, das zu LRF konvertiert werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Konvertiere %s in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Voreinstellungen zur Konvertierung wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Lesen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Sie haben nicht die nötigen Rechte, um diese Datei zu lesen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Es trat ein Fehler beim Lesen dieser Datei auf: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " ist kein gültiges Bild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1260,11 +1327,11 @@ msgstr "" "Datei vorbearbeiten bevor sie zu LRF konvertiert wird. Das ist hilfreich, " "wenn Sie wissen, dass die Datei von einer der folgenden Bezugsquellen stammt:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Bücher von BAEN Publishers</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" @@ -1272,11 +1339,11 @@ msgstr "" "<li><b>pdftohtml</b> - HTML Dateien, die mit dem Programm pdftohtml erstellt " "wurden</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - HTML Dateien von Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1285,7 +1352,7 @@ msgstr "" "Daten werden sowohl in der Datenbank als auch in der erstellten LRF Datei " "aktualisiert." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1293,7 +1360,7 @@ msgstr "" "Aussehen der erstellten LRF Datei durch die Angabe von Schriftgrößen und " "Wortabständen angleichen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1301,69 +1368,69 @@ msgstr "" "Seiteneinstellungen wie Ränder und die Bildschirmgröße des Zielgeräts " "angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Feineinstellung der Erkennung von Kapitel- und Absatzüberschriften." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Keine Hilfe verfügbar</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "eBooks auf einmal zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Kategorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Auswahlmöglichkeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Um&schlagbild der Quelldatei verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " -msgstr "&Autor: " +msgstr "&Autor(en): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1371,30 +1438,30 @@ msgstr "" "Autor dieses Buches ändern. Mehrere Autoren sollten durch Kommata getrennt " "werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "So&rtierung nach Autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Herausgeber: " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Herausgeber dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "&Etiketten: " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1403,183 +1470,195 @@ msgstr "" "Büchern. <br><br>Sie können für Etiketten durch Kommata getrennte Wörter " "oder Sätze verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Serien:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Serien. Sie können neue Serien hinzufügen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Index der Serien." -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Buch " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Ausgangsschrift&größe:" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " Punkt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Eingebundene Schriften" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "En&codierung der Quelldatei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "E&inrücken mindestens:" -#: /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:541 msgid "&Word spacing:" msgstr "&Wortabstand:" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Automatische &Rotation von Bildern einschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "&Leerzeilen zwischen Paragraphen einfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "&Tabellen ignorieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Farben nicht bea&chten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Vorbearbeiten:" -#: /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:548 msgid "Header" msgstr "Kopfzeile" -#: /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:549 msgid "&Show header" msgstr "Kopfzeile an&zeigen" -#: /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:550 msgid "&Header format:" msgstr "&Kopfzeilenformat:" -#: /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:551 msgid "Override<br>CSS" msgstr "CSS<br>überschreiben" -#: /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:552 msgid "&Profile:" msgstr "&Profil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Rand:" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " Pixel" -#: /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:555 msgid "&Right Margin:" msgstr "&Rechter Rand:" -#: /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:557 msgid "&Top Margin:" msgstr "&Oberer Rand:" -#: /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:559 msgid "&Bottom Margin:" msgstr "&Unterer Rand:" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "&Konvertiere Tabellen in Bilder (gut bei großen/komlexen Tabellen)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "&Faktor der Textgröße in gerenderten Tabellen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Auf Titel basierende Ermittlung" -#: /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:564 msgid "&Disable chapter detection" msgstr "Kapitel Ermittlung &deaktivieren" -#: /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:565 msgid "&Regular expression:" msgstr "&Regulärer Ausdruck:" -#: /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:566 msgid "Add &chapters to table of contents" msgstr "&Kapitel zum Inhaltsverzeichnis hinzufügen" -#: /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:567 msgid "Don't add &links to the table of contents" msgstr "Keine &Links zum Inhaltsverzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Auf Etiketten basierende Ermittlung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "&Seitenumbruch vor Element:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "Seitenumbruch vor Element &erzwingen:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Seitenumbruch vor &Attribut erzwingen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "Erkenne K&apitel bei Element:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Hilfe für das jeweilige Objekt" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1589,8 +1668,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1600,17 +1679,17 @@ msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-Informationen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1619,19 +1698,19 @@ msgstr "" "Dickens\" zum Beispiel als \"Dickens, Charles\"." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Bewertung:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " Sterne" @@ -1674,50 +1753,50 @@ msgstr "Kann kein Umschlagbild abrufen" msgid "You must specify the ISBN identifier for this book." msgstr "Sie müssen die ISBN für dieses Buch angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Serien entfernen (Serien ohne Bücher)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Meta-Daten vom Server abrufen" -#: /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:285 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Umschlagbild vom Server abrufen" -#: /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:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Benutzername und/oder Passwort Ihres Kontos bei LibraryThing.com ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Passwort ändern" @@ -1746,13 +1825,13 @@ msgid "Tag" msgstr "Etikett" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1787,39 +1866,39 @@ msgstr "" msgid "Negate" msgstr "Ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Übereinstimmung mit a&llen der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Übereinstimmung mit irge&ndeinem der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Suchkriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Mehr" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Weniger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Etiketten Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "&Verfügbare Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1827,23 +1906,23 @@ msgstr "" "Etikett aus der Datenbank löschen. Entfernt das Etikett von allen Büchern " "und löscht es dann aus der Datenbank." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Etikett dem aktuellen Buch zuweisen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Zuge&wiesene Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Etikett vom aktuellen Buch entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Etikett &anfügen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1851,7 +1930,7 @@ msgstr "" "Ist das gewünschte Etikett nicht in der Liste, kann es hier hinzugefügt " "werden. Akzeptiert eine durch Kommata getrennte Liste von Etiketten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Etikett zu den verfügbaren Etiketten hinzufügen und dem aktuellen Buch " @@ -1870,96 +1949,96 @@ msgid "Recipe for " msgstr "Rezept für " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "In erweiterten Modus umschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Zum Basis Modus wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Feed benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "Feed %s benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Gibts hier schon" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Dieser Feed wurde schon zu diesem Rezept hinzugefügt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Ungültige Eingabe" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Ungültige Eingabe" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Konnte Rezept nicht erstellen. Fehler:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Rezept ersetzen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" "Es gibt schon ein erstelltes Rezept mit dem Namen %s. Soll es ersetzt werden?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Eine Rezept Datei auswählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Eigene Nachrichtenquelle hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Verfügbare Benutzer-Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" -msgstr "&Rezept hinzufügen/aktualisieren" +msgstr "Rezept &hinzufügen/aktualisieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "Rezept entfe&rnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "Rezept ver&teilen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "Rezept aus Datei &laden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1984,56 +2063,56 @@ msgstr "" "Konfiguration bedarf. Dazu müssen Sie den \"Erweiterten Modus\" " "verwenden.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Titel des Rezepts:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "Ä<ester Artikel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "Ältester Artikel, der geladen wird" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " Tage" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Maximale Anzahl der Artikel pro feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Maximale Anzahl der zu ladenden Artikel pro feed." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds des Rezepts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Feed aus dem Rezept entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Feed zum Rezept hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Feed Titel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Feed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "Feed &anfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2042,7 +2121,7 @@ msgstr "" "besuchen Sie die englischsprachige Seite <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Source Code (Python) des Rezepts" @@ -2127,45 +2206,45 @@ msgstr "Regulärer Ausdruck Gruppenname (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Auftrag" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Status" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Fortschritt" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Laufzeit" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Fehler" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Fertig" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "Abwarten und Tee trinken..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Bei der Arbeit..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" -msgstr "Kann Auftrag nicht abbrechen." +msgstr "Kann Auftrag nicht abbrechen" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2173,62 +2252,62 @@ msgstr "" "Kann Aufträge nicht abbrechen, die mit dem Gerät kommunizieren, da dies zu " "Datenverlust führen kann." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Kann schon fertiggestellte Aufträge nicht abbrechen." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Kann Aufträge in Warteliste nicht abbrechen." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Keine" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Buch <font face=\"serif\">%s</font> von %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doppelklick ermöglicht <b>Bearbeitung</b><br><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Größe (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Datum" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Bewertung" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Pfad" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Zeitstempel" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Suche (Zur erweiterten Suche die Schaltfläche links klicken)" @@ -2248,15 +2327,15 @@ msgstr "Mit Trennstrich versehen" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Änderungen treten erst nach einem Neustart in Kraft." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - LRF Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Keine Treffer</b> für die Suchworte <i>%s</i> gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Keine Treffer gefunden" @@ -2300,11 +2379,11 @@ msgstr "eBook öffnen" msgid "Configure" msgstr "Konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2312,31 +2391,31 @@ msgstr "" "<p>Hilfe gibt es online bei <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s von <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "An Speicherkarte senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Meta-Daten einzeln bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Meta-Daten auf einmal bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2344,7 +2423,7 @@ msgstr "" "Bücher rekursiv hinzufügen (Ein Buch pro Verzeichnis, setzt voraus, dass " "jede eBook Datei das gleiche Buch in einem unterschiedlichen Format enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2352,49 +2431,49 @@ msgstr "" "Bücher rekursiv hinzufügen (Mehrere Bücher pro Verzeichnis, setzt voraus, " "dass jede eBook Datei ein anderes Buch enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Auf HD sichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Spezielles Format ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Einzeln konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Auf einmal konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Angeschlossen: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Gerätedatenbank ist beschädigt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2425,8 +2504,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2434,53 +2513,53 @@ msgstr "" "<p>Es existieren bereits Bücher mit dem selben Titel in der Datenbank. " "Sollen die folgenden Bücher trotzdem hinzugefügt werden?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" -msgstr "Duplikate gefunden" +msgstr "Duplikate gefunden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Lade Bücher auf das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Es können keine Bücher mehr auf das Gerät geladen werden, da der " "Gerätespeicher voll ist " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Lösche Bücher vom Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Kann Metadaten nicht bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Keine Bücher ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2488,68 +2567,68 @@ msgstr "" "Die folgenden Bücher konnten nicht auf das Gerät geladen werden, da keine " "geeigneten Formate vorhanden sind:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Speichern auf Festplatte nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Nachrichten abrufen von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Rufe Nachrichten ab von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Nachrichten abgerufen. Übertragung ans Gerät läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Konvertierung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Starte Massenkonvertierung von %d Büchern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Ansehen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Format zur Vorschau wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s hat keine verfügbaren Formate." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Konfiguration nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Konfiguration nicht möglich während Aufträge abgearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Kopiere Datenbank nach " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Ungültige Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2557,23 +2636,23 @@ msgstr "" "<p>Es existiert bereits eine ungültige Datenbank in %s, bitte löschen Sie " "diese, bevor sie die bestehende Datenbank verschieben.<br>Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Konnte Datenbank nicht verschieben" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Es ist keine weitere Information verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "Es ist keine weitere Information über Bücher auf dem Gerät verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2581,15 +2660,15 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "Datenbank existiert nicht" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2597,7 +2676,7 @@ msgstr "" "Das Verzeichnis, in dem die Datenbank sein sollte: %s existiert nicht mehr. " "Bitte wählen Sie einen neuen Ort für die Datenbank aus." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2605,7 +2684,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Letzte Version: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2613,102 +2692,115 @@ msgid "" msgstr "" "%s wurde auf Version %s aktualisiert. Sehen Sie sich die <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">neuen Features</a> an. " -"Download Seite besuchen?" +"Möchten Sie die Download Seite besuchen?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Neue Version verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Suche:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" "Liste der Bücher nach Titel oder Autor durchsuchen<br><br>Durch Leerzeichen " -"getrennte Wörter werden mit \"AND\" verknüpft" +"getrennte Wörter werden mit \"UND\" verknüpft" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" "Liste der Bücher nach Titel, Autor, Herausgeber, Etiketten und Bemerkungen " -"durchsuchen<br><br>Durch Leerzeichen getrennte Wörter werden mit \"AND\" " +"durchsuchen<br><br>Durch Leerzeichen getrennte Wörter werden mit \"UND\" " "verknüpft" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Quick Search löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Bücher hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Bücher entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Meta-Informationen editieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "An Reader übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Nachrichten abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "In eBooks umwandeln" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" +"Output der Konsole auf ein Dialog-Fenster umleiten (sowohl stdout als auch " +"stderr). Hilfreich bei Fenstern in denen GUI Programme nicht über Output-" +"Streams verfügen." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "FEHLER: Unbehandelte Ausnahme" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Neue individuelle Nachrichtenquelle hinzufügen" @@ -2758,11 +2850,11 @@ msgstr "Ungültiger regulärer Ausdruck" msgid "Invalid regular expression: %s" msgstr "Ungültiger regulärer Ausdruck: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2770,7 +2862,7 @@ msgstr "" "Reader\n" "%s verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2778,22 +2870,22 @@ msgstr "" "Karte\n" "%s verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Ein Klick zeigt die Liste der auf dem Computer vorhandenen Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Ein Klick zeigt die Liste der im Hauptspeicher des Geräts vorhandenen Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Ein Klick zeigt die Liste der auf der Speicherkarte des Geräts vorhandenen " "Bücher" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2801,7 +2893,7 @@ msgstr "" "Pfad zur Datenbank von calibre. Die Voreinstellung ist der in den " "Einstellungen gespeicherte Pfad." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2811,7 +2903,7 @@ msgstr "" "\n" "Listet die in der Datenbank von calibre verfügbaren Bücher auf. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2824,7 +2916,7 @@ msgstr "" "Verfügbare Felder: %s\n" "Voreinstellung: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2834,11 +2926,11 @@ msgstr "" "Verfügbare Felder: %s\n" "Voreinstellung: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Sortiere Ergebnisse in aufsteigender Reihenfolge" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2848,15 +2940,15 @@ msgstr "" "sehen Sie sich bitte die Dokumentation, die die Suche betrifft, im " "Benutzerhandbuch an. Voreinstellung ist, keine Filterung durchzuführen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Ungültige Felder. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Ungültiges Sortierungs-Feld. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2864,7 +2956,7 @@ msgstr "" "Die folgenden Bücher wurden nicht hinzugefügt, da sie schon in der Datenbank " "vorhanden sind (siehe --duplicates Option):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2878,7 +2970,7 @@ msgstr "" "Verzeichnisse angeben, sehen Sie sich dazu die zu den Verzeichnissen " "gehörigen Optionen weiter unten an. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2887,11 +2979,11 @@ msgstr "" "und alle Dateien in diesem Verzeichnis sind verschiedene eBook Formate " "dieses einzelnen Buches" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Verzeichnisse rekursiv verarbeiten" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2899,12 +2991,12 @@ msgstr "" "Füge Bücher zur Datenbank hinzu, auch wenn diese schon vorhanden sind. Der " "Abgleich erfolgt aufgrund des Titels der Bücher." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" "Sie müssen wenigstens eine Datei auswählen, die hinzugefügt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2919,11 +3011,11 @@ msgstr "" "(Sie erhalten die ID Zahlen durch die Benutzung des Befehls list). Zum " "Beispiel: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Sie müssen wenigstens ein Buch auswählen, das entfernt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2937,15 +3029,15 @@ msgstr "" "gekennzeichneten logischen Buches hinzu. Sie erhalten die ID durch den list " "Befehl. Falls das Format schon vorhanden ist, wird es ersetzt.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "Sie müssen eine ID und eine eBook Datei angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "eBook Datei muss eine Endung haben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2962,11 +3054,101 @@ msgstr "" "eine Dateiendung wie LRF oder TXT oder EPUB sein. Falls das logische Buch im " "entsprechenden Format nicht vorliegt, passiert gar nichts.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Sie müssen eine ID und ein Format (Dateiendung) angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Zeige die in der calibre Datenbank gespeicherten Meta-Daten für das durch " +"die ID erkannte Buch. \n" +"\"id\" ist eine ID Nummer des Befehls \"list\". \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Drucke Meta-Daten als OPF (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "Sie müssen eine ID angeben" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" +"\n" +"%prog set_metadata [options] id /verzeichnis/zu/metadata.opf\n" +"\n" +"Übernehme die Meta-Daten, die in der calibre Datenbank für das durch die ID " +"erkannte Buch gespeichert werden,\n" +"aus der OPF Datei metadata.opf. \"id\" ist eine ID Nummer des Befehls " +"\"list\". Sie erhalten \n" +"einen Eindruck über das OPF Format, wenn Sie die --as-opf Option mit dem \n" +"Befehl show_metadata verwenden.\n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "Geben Sie eine ID und eine Meta-Daten Datei an" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" +"%prog export [options] ids \n" +"\n" +"Exportiert die durch IDs angegebenen Bücher (als durch Kommata getrennte " +"Liste) in das Dateisystem.\n" +"Der Export speichert alle Formate des Buches, sein Umschlagbild und die Meta-" +"Daten (in \n" +"einer OPF Datei). Sie erhalten ID Nummern mit dem Befehl \"list\". \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" +"Exportiere alle Bücher der Datenbank, die Liste der IDs wird ignoriert." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "Exportiere Bücher in das angegebene Verzeichnis. Voreinstellung ist" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Exportiere alle Bücher in ein einziges Verzeichnis" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Erstelle Dateinamen mit \"Autor - Titel\" anstelle von \"Titel - Autor\"" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "Sie müssen IDs oder die %s Option angeben" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2987,11 +3169,11 @@ msgstr "" " \n" "Für Hilfe zu einem bestimmten Befehl (command): %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Auftrag durch Benutzer abgebrochen" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "Konnte Arbeitsprozess nicht starten." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "Konnte die fontconfig library nicht initialisieren" @@ -3017,7 +3199,7 @@ msgid "Unknown feed" msgstr "Feed unbekannt" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artikel ohne Titel" diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index e3ec255958..6b70b21f02 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-06-02 08:40+0000\n" "Last-Translator: Marc van den Dikkenberg <Unknown>\n" "Language-Team: Dutch <nl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -26,6 +26,12 @@ msgstr "" #~ "herschikt. Deze functie neemt de plaats in van de --foont-delta optie, en " #~ "vervangt deze. Om toch --font-delta te gebruiken, zet deze optie als 0." +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Voorkom automatische toevoeging van nieuwe pagina's voor herkende " +#~ "hoofdstukken." + #~ 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 " @@ -41,6 +47,12 @@ msgstr "" #~ "Bijvoorbeeld: --serief-famile \"%s, Times new Roman\"\n" #~ " " +#~ msgid "&Access Key;" +#~ msgstr "&Toegangssleutel" + +#~ msgid "Job killed by user" +#~ msgstr "Opdracht beëindigd door gebruiker" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -48,11 +60,34 @@ msgstr "" #~ "Schrijf de tekst hieronder in een bestand genaamd recipe.py en stuur deze " #~ "naar je vrieden, zodat zij dit recept ook kunnen gebruiken." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sGebruik%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Gemaakt door " @@ -75,8 +110,12 @@ msgstr "" "worden. Standaard: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Onbekend" @@ -99,7 +138,7 @@ msgstr "Zoeksleutel voor de auteur" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Uitgeverij" @@ -205,7 +244,7 @@ msgstr "" "Geef alle inhoud weer als zwart op wit in plaats van in de kleuren die zijn " "gedefinieerd in de HTML of CSS code." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 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 " @@ -215,23 +254,35 @@ msgstr "" "profiel bepaalt zaken zoals de resolutie en scherm grootte van het doel " "apparaat. Standaard: %s Ondersteunde profielen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Linker kantlijn van pagina. Standaard is %default pixels." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Rechter kantlijn van pagina. Standaard is %default pixels." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Boven marge van pagina. Standaard is %default pixels." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Onder marge van pagina. Standaard is %default pixels." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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 <a> tags are " @@ -241,7 +292,7 @@ msgstr "" "0 betekent dat de links niet zullen worden gevolgd. Een negatieve waarde " "betekent dat <a> tags worden genegeerd." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -249,18 +300,15 @@ msgstr "" "Een reguliere expressie. <a> tags waar de href mee overeen komt worden " "genegeerd. Standaard: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Voeg geen links toe aan de inhoudsopgave." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Voorkom automatische toevoeging van nieuwe pagina's voor herkende " -"hoofdstukken." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -268,7 +316,15 @@ msgstr "" "De reguliere expressie die wordt gebruikt om hoofdstukken te herkennen. Deze " "wordt gezocht in 'heading tags' (h1-h6). Standaard: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -287,14 +343,14 @@ msgstr "" "tijd nodig hebben om om te slaan in LRF formaat. Deze optie zal worden " "genegeerd als de huidige pagina weinig elementen bevat." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Forceer een pagina scheiding voor tags wiens naam overeenkomen met deze " "reguliere expressie." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -307,15 +363,15 @@ msgstr "" "class=\"chapter\" te vinden, gebruik: \"h\\d,class,chapter\". Standaard is " "%default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "Voeg gevonden hoofdstukken toe aan de inhoudsopgave." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "Verwerk Baen HTML bestanden om de gegenereerde RTF te verbeteren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -323,11 +379,11 @@ msgstr "" "Deze optie moet worden toegevoegd indien er bestanden worden verwerkt die " "zijn gegenereerd door pdftohtml, anders zal de conversie falen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Gebruik deze optie met Book Designer html0 bestanden." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -335,27 +391,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "De serif lettertype familie om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "De sand-serif familie om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "De monospace familie om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Geef een uitgebreide omschrijving tijdens het verwerken" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Converteer naar LRS" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -364,7 +420,7 @@ msgstr "" "verwerkingstijd. Gebruik deze optie als je een machine met weinig geheugen " "gebruikt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -439,56 +495,56 @@ msgstr "Opties om het gedrag van html2lrf te beïnvloeden." msgid "Fetching of recipe failed: " msgstr "Ophalen van recept mislukt: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer bestand herkend." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tLezen HTML" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen bestand herkend. Her-lezen..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "Schrijf pre-info HTML naar " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Verwerking %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConveteer naar BBEB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Kan bestand niet parseren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s is een leeg bestand" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Link %s %s kan niet worden geparseerd" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Link %s kan niet worden toegevoegd aan de inhoudsopgave" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Niet mogelijk om afbeelding %s te verwerken. Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Niet mogelijk om interlaced PNG bestand %s te verwerken." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -496,14 +552,14 @@ msgstr "" "Niet mogelijk om afbeelding %s te verwerken\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Een fout is opgetreden tijdens het verwerken van een tabel: %s. Tabel opmaak " "zal worden genegeerd." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -511,11 +567,11 @@ msgstr "" "Foutieve tabel:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "Tabel heeft een cel die te groot is." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -523,19 +579,19 @@ msgstr "" "De website %s moet eerst als een HTML bestand worden weggeschreven, waarna " "je deze met html2rlf kunt converteren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Omslag afbeelding kan niet worden ingelezen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Kan niet lezen van: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Verwerking van OPF bestand is niet gelukt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -870,19 +926,19 @@ msgstr "Gebruik: pdf-meta bestand.pdf" msgid "No filename specified." msgstr "Geen bestandsnaam opgegeven" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opties] mijnboek.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Output folder. Standaard is dit de huidige folder." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "RAW MOBI HTML bewaard in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "OEB boek bemaakt in" @@ -890,18 +946,18 @@ msgstr "OEB boek bemaakt in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Opmerkingen" @@ -928,33 +984,33 @@ msgstr "Eenvoudig" msgid "Advanced" msgstr "Geavanceerd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Moet een folder zijn." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Foutieve database locatie " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Foutieve database locatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Foutieve database locatie.<br>Kan niet schrijven naar " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Database aan het comprimeren. Dit kan even duren." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Comprimeren..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuratie" @@ -969,21 +1025,21 @@ msgstr "Blader naar de nieuwe database locatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1068,9 +1124,9 @@ msgid "ERROR" msgstr "FOUT" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Auteur(s)" @@ -1082,19 +1138,23 @@ msgstr "Auteur sortering" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Kan geen verbinding maken" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "Een geldige toegangssleutel is nodig voor isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Geen metadata gevonden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1118,8 +1178,8 @@ msgstr "" "krijgen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Toegangssleutel" +msgid "&Access Key:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1136,7 +1196,7 @@ msgstr "" "Selecteer het boek dat het meest overeenkomt met dat van jou uit de lijst " "hieronder" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Opdracht details" @@ -1144,6 +1204,10 @@ msgstr "Opdracht details" msgid "Unavailable" msgstr "Niet beschikbaar" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Actieve opdrachten" @@ -1152,73 +1216,73 @@ msgstr "Actieve opdrachten" msgid "&Stop selected job" msgstr "%Stop de geselecteerde opdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Uiterlijk & gedrag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Pagina Instellingen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Hoofdstuk Detectie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Geen beschikbare formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Kan %s niet converteren aangezien dit boek geen ondersteunde formaten bevat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Kies het formaat om naar LRF te converteren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Converteer %s naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Zet conversie standaarden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Kan niet lezen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Je hebt geen permissie om het bestand te lezen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Fout bij het lezen van bestand" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Er is een fout opgetreden bij het lezen van bestand: <br></b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " is geen geldige afbeelding" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1227,11 +1291,11 @@ msgstr "" "je weet dat het bestand van een specifieke bron afkomstig is. Bekende " "bronnen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Boeken van BAEN Uitgeverijen</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" @@ -1239,11 +1303,11 @@ msgstr "" "<li><b>pdftohtml</b> - HTML bestanden die zijn gegenereerd door " "pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - HTML0 bestanden van Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1251,7 +1315,7 @@ msgstr "" "Geef metadata zoals de titel en auteur van het boek. <p>Metadata zal worden " "geupload in de database, evenals in het gegenereerde LRF bestand." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1259,7 +1323,7 @@ msgstr "" "Verander de weergave van het gegenereerde LRF bestand door de lettertype " "grootte en spatiëring tussen woorden aan te passen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1267,69 +1331,69 @@ msgstr "" "Specificeer de pagina indeling zoals kantlijnen en de scherm grootte van het " "doel aparaat." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "stel de detectie van hoofdstuk en sectie koppen in" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Help is niet beschikbaar</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Converteer meerdere eboeken naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Converteer naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opties" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Boek Omslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Verander &Omslag Afbeelding" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Zoek een afbeelding om als omslag voor dit boek te gebruiken." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Gebruik omslag van &bron bestand" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Verander de titel van dit boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Auteur(s) " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1337,30 +1401,30 @@ msgstr "" "Verander de auteur(s) van dit boek. Meerdere auteurs moeten met een komma " "van elkaar worden gescheiden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "Auteur So&rteer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Uitgeverij " -#: /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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Verander de uitgever van dit boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Ta&gs " -#: /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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1369,214 +1433,216 @@ msgstr "" "zoeken. <br><br>Ze kunnen woorden of zinsdelen bevatten, gescheiden door " "komma's." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "%Series:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Lijst van bekende series. Je kunt nieuwe series toevoegen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Series Index." -#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Boek " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Basis &Letter grootte" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Toegevoegde Lettertypen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "%Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "Bron &Codering" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "Minimum &indentie:" -#: /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:541 msgid "&Word spacing:" msgstr "&Woord spatiëring" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "Activeer auto &rotatie van afbeeldingen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Voeg &blanco regels to tussen paragrafen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Negeer &tabellen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Negeer &kleuren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Verwerk" -#: /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:548 msgid "Header" msgstr "Koptekst" -#: /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:549 msgid "&Show header" msgstr "Laat koptekst &zien" -#: /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:550 msgid "&Header format:" msgstr "&Koptekst Formaat:" -#: /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:551 msgid "Override<br>CSS" msgstr "Negeer<br>CSS" -#: /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:552 msgid "&Profile:" msgstr "&Profiel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Kantlijn:" -#: /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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /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:555 msgid "&Right Margin:" msgstr "&Rechter Kantlijn:" -#: /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:557 msgid "&Top Margin:" msgstr "&Boven Marge:" -#: /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:559 msgid "&Bottom Margin:" msgstr "&Onder Marge:" -#: /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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Detectie gebaseerd op Titel" -#: /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:564 msgid "&Disable chapter detection" msgstr "&Deactiveer hoofdstuk detectie" -#: /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:565 msgid "&Regular expression:" msgstr "&Reguliere expressie:" -#: /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:566 msgid "Add &chapters to table of contents" msgstr "Voeg hoofdstukken toe aan de &inhoudsopgave" -#: /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:567 msgid "Don't add &links to the table of contents" msgstr "Voeg geen &links toe aan de inhoudsopgave" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Tag-gebaseerde detectie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "Nieuwe &Pagina voor tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Forceer nieuwe pagina voor tag:" -#: /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:571 msgid "Force page break before &attribute:" msgstr "Forceer nieuwe pagina voor &attribuut:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Help voor onderdeel" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" msgstr "" -"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " -"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" -"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " -"type=\"text/css\">\n" -"p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" -"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " -"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" -"family:'Sans Serif'; font-size:9pt;\"></p></body></html>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 msgid "Edit Meta information" msgstr "Verander Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "Auteur S&ortering: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1585,19 +1651,19 @@ msgstr "" "Bijvoorbeeld: Charles Dickens moet worden gesorteerd als: Dickens, Charles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Rangschikking" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Rangschikking van dit boek. 0-5 sterren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " sterren" @@ -1640,51 +1706,51 @@ msgstr "Kan omslag niet downloaden" msgid "You must specify the ISBN identifier for this book." msgstr "Het ISBN nummer voor dit boek moet worden opgegeven." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Verander Meta Informatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Open Tag Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Verwijder ongebruikte series (Series die geen boeken bevatten)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:284 msgid "Fetch metadata from server" msgstr "Download metadata van server" -#: /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:285 msgid "Available Formats" msgstr "Beschikbare Formaten" -#: /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:286 msgid "Add a new format for this book to the database" msgstr "Voeg een nieuw formaat voor dit boek toe aan de database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Verwijder de geselecteerde formaten voor dit boek van de database." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Download omslag afbeelding van de server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Verander de gebruikernaam en/of wachtwoord voor je account met " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Wachtwoord wijzigen" @@ -1713,13 +1779,13 @@ msgid "Tag" msgstr "Tag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formaat" @@ -1754,39 +1820,39 @@ msgstr "" msgid "Negate" msgstr "omdraaien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Geavanceerde zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Voldoe aan a&lle van de volgende criteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Voldoe aan een &ieder van de volgende criteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Zoekcriteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Meer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Minder" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Tag-bewerker" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "&Beschikbare tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1794,23 +1860,23 @@ msgstr "" "Verwijder tag uit database. Dit verwijderd de tag van alle boeken, en daarna " "uit de database." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Pas tag toe aan het huidige boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Toege&paste tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Verwijder tag uit het huidige boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Voeg tag &toe:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1818,7 +1884,7 @@ msgstr "" "Als de tag die wilt gebruiken niet in de beschikbare lijst voorkomt, dan kun " "je hem hier toevoegen als lijst gescheiden met komma's." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Voeg een tag toe aan de beschikbare lijst, evenals aan het huidige boek" @@ -1836,95 +1902,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "Schakel over naar geavanceerde modus" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Schakel over naar simpele modus" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Feed heeft een titel nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "De feed heeft een titel nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Feed heeft een URL nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "De feed %s heeft een URL nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Bestaat al" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Deze feed is al aan een recept toegevoegd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Ongeldige invoer" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Ongeldige invoer" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Een recept kon niet worden aangemaakt. Foutmelding:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Recept vervangen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "Een persoonlijk recept genaat %s bestaat al. Wilt u deze vervangen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Kies een recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Recepten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Voeg een persoonlijke nieuws bron toe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Beschikbare gebruikers recepten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Voeg toe/Update &recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Verwijder recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "&Deel recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "&Laad bestand met recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1948,56 +2014,56 @@ msgstr "" "daarna de \"geavanceerde modus\" moeten gebruiken om het download process in " "te kunnen stellen.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "Recept &title:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "&Oudste artikel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "Het oudste artikel om te downloaden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " dagen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Max. aantal artikelen per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Maximum aantal artikelen te downloaden per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds in recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Verwijder van recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Voeg feed toe aan recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Feed titel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Feed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "V&oeg feed toe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2007,7 +2073,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Gebruikers Recep" "ten</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Recept bron code (python)" @@ -2092,45 +2158,45 @@ msgstr "Reguliere expressie groep naam (?<serie_index>)" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Opdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Status" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Voortgang" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Werktijd" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Fout" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Voltooid" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "Wachten" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Bezig" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "Opdracht kan niet worden afgebroken" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2138,62 +2204,62 @@ msgstr "" "Opdrachten die communiceren met de lezer kunnen niet worden afgebroken omdat " "dit data corruptie kan veroorzaken." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Opdrachten die al zijn voltooid kunnen niet worden afgebroken." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Wachtende opdrachten kunnen niet worden afgebroken." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Geen" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tags" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Boek <font face=\"serif\">%s</font> van %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Dubbel-klik om me te <b>wijzigen</b><br><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Grootte (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Datum" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Waardering" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Pad" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Tijdsaanduiding" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Zoeken (Voor geavanceerd zoeken klik op de knop links)" @@ -2213,15 +2279,15 @@ msgstr "Afbreken" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Veranderingen zijn pas zichtbaar na een herstart." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - LRF Viewer" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Geen Resultaten</b> voor de zoekterm <i>%s</i> gevonden." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Geen resultaten gevonden" @@ -2265,11 +2331,11 @@ msgstr "Open eboek" msgid "Configure" msgstr "Configureer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2277,32 +2343,32 @@ msgstr "" "<p>Voor assistentie, bezoek <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" "<b>%s</b>: %s door <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Stuur naar hoofdgeheugen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Stuur naar opslag kaart" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Bewerk metadata individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Bewerk metadata in groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Voeg boeken toe uit een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2310,7 +2376,7 @@ msgstr "" "Voeg recursief boeken toe (Een boek per folder, neemt aan dat ieder eboek " "bestand hetzelfde boek is in een ander formaat)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2318,49 +2384,49 @@ msgstr "" "voeg recursief boeken toe (Meerdere boeken per folder, neemt aan dat ieder " "eboek bestand een ander boek is)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Opslaan op schijf" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Opslaan op schijf in een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Bekijk" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Bekijk specifiek formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Converteer Individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Converteer Groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " gedetecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Apparaat: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Apparaat Database Beschadigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2389,8 +2455,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2398,53 +2464,53 @@ msgstr "" "<p>Boeken met de volgende titels bestaan al in de database. Wil je ze echt " "toevoegen?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Duplicaten gevonden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Boeken worden geupload naar de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Geen schijfruimte op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>De boeken kunnen niet worden geupload naar de lezer, omdat er onvoldoende " "schijfruimte beschikbaar is " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Boeken worden verwijderd van de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Metedata kan niet worden gewijzigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Geen boeken geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Boeken worden naar de lezer verzonden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Geen geschikte formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2452,68 +2518,68 @@ msgstr "" "De volgende boeken konden niet naar de lezer worden deupload, omdat geen " "geschikt formaat werd gevonden:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Kan niet naar schijf worden opgeslagen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Download nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Downloading nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Nieuws gedownload, uploading naar lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Kan niet converteren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Begin groep convertering van %d boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Geen boek geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Kan niet bekijken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Kies het te bekijken formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s heeft geen beschikbare formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Kan niet configureren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Can niet configueren terwijl bestaande opdrachten bezig zijn" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "copieer database naar " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "ongeldige database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2521,23 +2587,23 @@ msgstr "" "<p>Een ongeldige database bestaat op %s, verwijder deze voordat je probeert " "de bestaande database te verplaatsen.<br>Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Database kon niet worden verplaatst" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Geen details beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "Geen details zijn beschikbaar voor de boeken op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2545,15 +2611,15 @@ msgstr "" "Er is een tijdelijke fout opgetreden tijdens de communicatie met de lezer. " "verwijzer de lezer en plug hem opnieuw in, of herstart." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "database bestaat niet" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2561,7 +2627,7 @@ msgstr "" "De folder waarin de database zou moetten zijn: %s bestaat niet meer. Kies " "een nieuwe database locatie." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2569,34 +2635,34 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Laatste versie: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Geavanceerde Zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Zoeken:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2604,7 +2670,7 @@ msgstr "" "Zoek de boekenlijst op titel of auteur<br><br>Meerdere woorden met spaties " "worden allen gebruikt." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2612,63 +2678,73 @@ msgstr "" "Zoek de boekenlijst op titel, auteur, uitgeverij, tags of " "opmerkingen.<br><br>Meerdere woorden met spaties worden allen gebruikt." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Snelzoeken wissen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Voeg boeken toe" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Verwijder boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Del" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Wijzig meta informatie" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Zend naar lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Download niews" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Converteer E-boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Voeg een persoonlijke nieuwsbron toe" @@ -2718,11 +2794,11 @@ msgstr "Ongeldige reguliere expressie" msgid "Invalid regular expression: %s" msgstr "Ongeldige reguliere expressie: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Bibliotheek" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2730,7 +2806,7 @@ msgstr "" "Lezer\n" "%s beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2738,20 +2814,20 @@ msgstr "" "Kaart\n" "%s beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Klik om een de lijst met boeken op uw computer te zien" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Klik om de lijst met boeken in het hoofdgeheugen van uw lezer te zien" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "Klik om de lijst met boeken op de opslag kaart van uw lezer te zien" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2759,7 +2835,7 @@ msgstr "" "Pad naad de Calibre database. Standaard word het pad gebruikt dat is " "opgeslagen in de instellingen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2769,7 +2845,7 @@ msgstr "" "\n" "Laat de boeken zien die beschikbaar zijn in de Calibre database. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2781,7 +2857,7 @@ msgstr "" "Beschikbare velden: %s\n" "Standaard: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2791,11 +2867,11 @@ msgstr "" "Beschikbare velden: %s\n" "Standaard: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Sorteer resultaten in oplopende volgorde" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2805,15 +2881,15 @@ msgstr "" "kijk naar de zoek-gerelateerde documentatie in de gebruikershandleiding. " "Standaard word er niet gefilterd." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Ongeldig veld. Beschikbare velden:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Ongeldig sorteer veld. Beschikbare velden:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2821,7 +2897,7 @@ msgstr "" "De volgende boeken zijn niet toegevoegd omdat ze al bestaan in de database. " "(Zie de --duplicates optie):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2834,7 +2910,7 @@ msgstr "" "Voeg de gespecificeerde bestanden als boeken toe aan de database. Je kunt " "ook folders opgeven, zie de folder-gerelateerde opties hieronder. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2843,11 +2919,11 @@ msgstr "" "bestanden in de folder verschillende bestandsformaten zin voor dat enkele " "boek." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Bewerk folders recursief" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2855,11 +2931,11 @@ msgstr "" "Voeg boeken toe aan de database zelfs als deze al bestaan. Vergelijking is " "gebaseerd op de boek titels." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "Ten minste een boek moet worden opgegeven om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2873,11 +2949,11 @@ msgstr "" "moeten een lijst zijn die is gescheiden door komma's. (Je kan de id nummers " "zien door het list commando te gebruiken). Bijvoorbeeld, 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Ten minste een boek moet worden opgegeven om te verwijderen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2892,15 +2968,15 @@ msgstr "" "door het list commando te gebruiken. Als het formaat al bestaat, dan zal het " "worden vervangen.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "zowel een id als een eboek bestand moeten worden gespecificeerd" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "eboek bestand heeft een extensie nodig" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2917,11 +2993,77 @@ msgstr "" "bestands extensie zoals LRF, TXT of EPUB. Als het logische boek niet in dit " "formaat bestaat, dan zal er niets gebeuren.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Een id en een formaat moeten worden opgegeven" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2939,11 +3081,11 @@ msgstr "" "commando is een van de volgende:\n" " %s\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Opdracht beëindigd door gebruiker" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2969,7 +3111,7 @@ msgid "Unknown feed" msgstr "Onbekende feed" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artikel zonder naam" diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index 9701545c99..cf98e8f7e1 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.55\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-05-24 06:25+0000\n" "Last-Translator: Kovid Goyal <Unknown>\n" "Language-Team: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "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:128 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:134 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:136 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:138 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:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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 <a> tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 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:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,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:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 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:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 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:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /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:380 +#: /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:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 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:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 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:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 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/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " 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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " 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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /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:541 msgid "&Word spacing:" msgstr "" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" 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:548 msgid "Header" 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:549 msgid "&Show header" 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:550 msgid "&Header format:" 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:551 msgid "Override<br>CSS" 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:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" 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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /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:555 msgid "&Right Margin:" msgstr "" -#: /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:557 msgid "&Top Margin:" 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:559 msgid "&Bottom Margin:" 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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" 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:564 msgid "&Disable chapter detection" 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:565 msgid "&Regular expression:" 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:566 msgid "Add &chapters to table of contents" 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:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" 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:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1354,36 +1397,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 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:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr "" @@ -1422,49 +1465,49 @@ msgstr "" msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" 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:285 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "" -#: /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:288 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "" -#: /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:295 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:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1493,13 +1536,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "" @@ -1530,67 +1573,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1607,95 +1650,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1709,62 +1752,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -1843,106 +1886,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -1962,15 +2005,15 @@ msgstr "" msgid "<b>Changes will only take affect after a restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "" @@ -2014,95 +2057,95 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2118,268 +2161,278 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2424,48 +2477,48 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2473,39 +2526,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2514,27 +2567,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2543,11 +2596,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2556,15 +2609,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2574,11 +2627,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2590,11 +2709,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2620,7 +2739,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 43ea54d181..492dd37111 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.17\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-05-24 06:19+0000\n" "Last-Translator: Kovid Goyal <Unknown>\n" "Language-Team: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "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:128 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:134 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:136 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:138 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:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 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 <a> tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 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:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 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 " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,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:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 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:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 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 " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 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:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 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 " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /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:380 +#: /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:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 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:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 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:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 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/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /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:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " 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:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " 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:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /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:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /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:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /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:541 msgid "&Word spacing:" msgstr "" -#: /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:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" 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:548 msgid "Header" 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:549 msgid "&Show header" 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:550 msgid "&Header format:" 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:551 msgid "Override<br>CSS" 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:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" 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:537 -#: /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:541 +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /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:555 msgid "&Right Margin:" msgstr "" -#: /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:557 msgid "&Top Margin:" 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:559 msgid "&Bottom Margin:" 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:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" 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:564 msgid "&Disable chapter detection" 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:565 msgid "&Regular expression:" 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:566 msgid "Add &chapters to table of contents" 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:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" 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:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /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:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1354,36 +1397,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 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:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr "" @@ -1422,49 +1465,49 @@ msgstr "" msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" 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:285 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "" -#: /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:288 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "" -#: /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:295 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:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1493,13 +1536,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "" @@ -1530,67 +1573,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1607,95 +1650,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1709,62 +1752,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -1843,106 +1886,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -1962,15 +2005,15 @@ msgstr "" msgid "<b>Changes will only take affect after a restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "" @@ -2014,95 +2057,95 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2118,268 +2161,278 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2424,48 +2477,48 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2473,39 +2526,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2514,27 +2567,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2543,11 +2596,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2556,15 +2609,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2574,11 +2627,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2590,11 +2709,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2620,7 +2739,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/te.po b/src/calibre/translations/te.po new file mode 100644 index 0000000000..ef2a4bba73 --- /dev/null +++ b/src/calibre/translations/te.po @@ -0,0 +1,2974 @@ +# Telugu translation for calibre +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the calibre package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: calibre\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 13:22+0000\n" +"Last-Translator: వీవెన్ (Veeven) <Unknown>\n" +"Language-Team: Telugu <te@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 +msgid "%sUsage%s: %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 +msgid "Created by " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +msgid "Unable to detect the %s disk drive. Try rebooting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 +msgid "Set the title. Default: filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:75 +msgid "" +"Set the author(s). Multiple authors should be set as a comma separated list. " +"Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 +msgid "Unknown" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:78 +msgid "Set the comment." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:80 +msgid "Set the category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:82 +msgid "Sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:84 +msgid "Sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 +msgid "Publisher" +msgstr "ప్రచురణకర్త" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:88 +msgid "Path to file containing image to be used as cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:90 +msgid "" +"If there is a cover graphic detected in the source file, use that instead of " +"the specified cover." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:93 +msgid "Output file name. Default is derived from input filename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:95 +msgid "" +"Render HTML tables as blocks of text instead of actual tables. This is " +"neccessary if the HTML contains very large or complex tables." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:98 +msgid "" +"Specify the base font size in pts. All fonts are rescaled accordingly. This " +"option obsoletes the --font-delta option and takes precedence over it. To " +"use --font-delta, set this to 0. Default: %defaultpt" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:100 +msgid "Enable autorotation of images that are wider than the screen width." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:103 +msgid "Set the space between words in pts. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:105 +msgid "Separate paragraphs by blank lines." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:107 +msgid "Add a header to all the pages with title and author." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:109 +msgid "" +"Set the format of the header. %a is replaced by the author and %t by the " +"title. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:111 +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:113 +msgid "" +"Use the <spine> 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:115 +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:117 +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:122 +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:128 +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:134 +msgid "Left margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 +msgid "Right margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 +msgid "Top margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 +msgid "Bottom margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +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:144 +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:149 +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 <a> tags are " +"ignored." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +msgid "" +"A regular expression. <a> tags whose href matches will be ignored. Defaults " +"to %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 +msgid "Don't add links to the table of contents." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +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:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 +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 " +"whose names match this regular expression. Defaults to %default. You can " +"disable it by setting the regexp to \"$\". The purpose of this option is to " +"try to ensure that there are no really long pages as this degrades the page " +"turn performance of the LRF. Thus this option is ignored if the current page " +"has only a few elements." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +msgid "" +"Force a page break before tags whose names match this regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 +msgid "" +"Force a page break before an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +msgid "Add detected chapters to the table of contents." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 +msgid "Preprocess Baen HTML files to improve generated LRF." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +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:191 +msgid "Use this option on html0 files from Book Designer." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 +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 " +"slower page turns. For example: --serif-family \"Times New Roman\"\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 +msgid "The serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 +msgid "The sans-serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 +msgid "The monospace family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 +msgid "Be verbose while processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 +msgid "Convert to LRS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 +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:218 +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 " +"files from windows computers is cp-1252. Another common choice is utf-8. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:143 +msgid "" +"any2lrf [options] myfile\n" +"\n" +"Convert any ebook format into LRF. Supported formats are:\n" +"LIT, RTF, TXT, HTML, EPUB, MOBI, PRC and PDF. any2lrf will also process a " +"RAR or\n" +"ZIP archive, looking for an ebook inside the archive.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:158 +msgid "No file to convert specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 +msgid "" +"Usage: %prog [options] mybook.epub\n" +" \n" +" \n" +"%prog converts mybook.epub to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +msgid "" +"%prog [options] mybook.fb2\n" +"\n" +"\n" +"%prog converts mybook.fb2 to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 +msgid "Print generated HTML to stdout and quit." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 +msgid "Options to control the behavior of feeds2disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:24 +msgid "Options to control the behavior of html2lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:46 +msgid "Fetching of recipe failed: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +msgid "\tBook Designer file detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +msgid "\tParsing HTML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +msgid "\tBaen file detected. Re-parsing..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +msgid "Written preprocessed HTML to " +msgstr "" + +#: /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:386 +msgid "\tConverting to BBeB..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 +msgid "Could not parse file: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 +msgid "%s is an empty file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 +msgid "Failed to parse link %s %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 +msgid "Cannot add link %s to TOC" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 +msgid "Unable to process image %s. Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 +msgid "Unable to process interlaced PNG %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 +msgid "" +"Could not process image: %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 +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:1744 +msgid "" +"Bad table:\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 +msgid "Table has cell that is too large" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 +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:1838 +msgid "Could not read cover image: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +msgid "Cannot read from: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 +msgid "Failed to process opf file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 +msgid "" +"Usage: %prog [options] mybook.html\n" +"\n" +"\n" +"%prog converts mybook.html to mybook.lrf. \n" +"%prog follows all links in mybook.html that point \n" +"to local files recursively. Thus, you can use it to \n" +"convert a whole tree of HTML files." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +msgid "" +"Usage: %prog [options] mybook.lit\n" +"\n" +"\n" +"%prog converts mybook.lit to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:132 +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:133 +msgid "Output LRS file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:151 +msgid "Parsing LRF..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:154 +msgid "Creating XML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:156 +msgid "LRS written to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:243 +msgid "Could not read from thumbnail file:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:263 +msgid "" +"%prog [options] file.lrs\n" +"Compile an LRS file into an LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:264 +msgid "Path to output file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +msgid "Verbose processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 +msgid "Convert LRS to LRS, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454 +msgid "Invalid LRF file. Could not set metadata." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579 +msgid "" +"%prog [options] mybook.lrf\n" +"\n" +"\n" +"Show/edit the metadata in an LRF file.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18 +msgid "Set the book title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588 +msgid "Set sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590 +msgid "Set the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592 +msgid "Set sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22 +msgid "The category this book belongs to. E.g.: History" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597 +msgid "Path to a graphic that will be set as this files' thumbnail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600 +msgid "" +"Path to a txt file containing the comment to be stored in the lrf file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604 +msgid "Extract thumbnail from LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606 +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:608 +msgid "Set book ID" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610 +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" +"\n" +"\n" +"%prog converts mybook.mobi to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:42 +msgid "Could not find pdftohtml, check it is in your PATH" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:51 +msgid " does not allow copying of text." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:54 +msgid "" +" is an image based PDF. Only conversion of text based PDFs is supported." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:61 +msgid "" +"%prog [options] mybook.pdf\n" +"\n" +"\n" +"%prog converts mybook.pdf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:402 +msgid "" +"Path to output directory in which to create the HTML file. Defaults to " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 +msgid "Be more verbose." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 +msgid "You must specify a single PDF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/rtf/convert_from.py:20 +msgid "" +"%prog [options] mybook.rtf\n" +"\n" +"\n" +"%prog converts mybook.rtf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:17 +msgid "" +"%prog [options] mybook.txt\n" +"\n" +"\n" +"%prog converts mybook.txt to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20 +msgid "Set the authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24 +msgid "Set the comment" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +msgid "mybook.epub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +msgid "Usage:" +msgstr "వాడుక:" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 +msgid "" +"\n" +"%prog [options] key\n" +"\n" +"Fetch metadata for books from isndb.com. You can specify either the \n" +"books ISBN ID or its title and author. If you specify the title and author,\n" +"then more than one book may be returned.\n" +"\n" +"key is the account key you generate after signing up for a free account from " +"isbndb.com.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 +msgid "The ISBN ID of the book you want metadata for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 +msgid "The author whose book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 +msgid "The title of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 +msgid "The publisher of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:46 +msgid "" +"Could not fetch cover as server is experiencing high load. Please try again " +"later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:47 +msgid " not found." +msgstr " దొరకలేదు." + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:50 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:81 +msgid "LibraryThing.com server error. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:59 +msgid "" +"\n" +"%prog [options] ISBN\n" +"\n" +"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747 +msgid "Usage: %s file.lit" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754 +msgid "Cover saved to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:36 +msgid "Usage: pdf-meta file.pdf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:37 +msgid "No filename specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 +msgid "%prog [options] myebook.mobi" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 +msgid "Raw MOBI HTML saved in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 +msgid "OEB ebook created in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +msgid "Title" +msgstr "శీర్షిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 +msgid "Comments" +msgstr "వ్యాఖ్యలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +msgid "Dialog" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +msgid "TextLabel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +msgid "Choose Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22 +msgid "Basic" +msgstr "ప్రాధమిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 +msgid "Advanced" +msgstr "ఉన్నత" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +msgid "<br>Must be a directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +msgid "Invalid database location " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +msgid "Invalid database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +msgid "Invalid database location.<br>Cannot write to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 +msgid "Compacting database. This may take a while." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 +msgid "Compacting..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +msgid "Configuration" +msgstr "స్వరూపణం" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199 +msgid "&Location of books database (library1.db)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200 +msgid "Browse for the new database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +msgid "..." +msgstr "..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:202 +msgid "Use &Roman numerals for series number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203 +msgid "Default network &timeout:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204 +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:205 +msgid " seconds" +msgstr " క్షణాలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +msgid "&Priority for conversion jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +msgid "Frequently used directories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +msgid "Add a directory to the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +msgid "Remove a directory from the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +msgid "Toolbar" +msgstr "పనిముట్ల పట్టీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +msgid "Large" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +msgid "Medium" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +msgid "Small" +msgstr "చిన్న" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +msgid "&Button size in toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +msgid "Show &text in toolbar buttons" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +msgid "Free unused diskspace from the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +msgid "&Compact database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +msgid "&Metadata from file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:41 +msgid "ERROR" +msgstr "పొరపాటు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 +msgid "Author(s)" +msgstr "రచయిత(లు)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:38 +msgid "Author Sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:40 +msgid "ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 +msgid "Cannot connect" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +msgid "You must specify a valid access key for isbndb.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 +msgid "No metadata found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 +msgid "" +"No metadata found, try adjusting the title and author or the ISBN key." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:77 +msgid "Fetch metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:78 +msgid "Fetching metadata for <b>%1</b>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:79 +msgid "" +"Sign up for a free account from <a " +"href=\"http://www.isbndb.com\">ISBNdb.com</a> to get an access key." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 +msgid "&Access Key:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 +msgid "Fetch" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:82 +msgid "Matches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:83 +msgid "" +"Select the book that most closely matches your copy from the list below" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 +msgid "Details of job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:27 +msgid "Unavailable" +msgstr "అందుబాటులో లేదు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 +msgid "Active Jobs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:39 +msgid "&Stop selected job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +msgid "Metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +msgid "Look & Feel" +msgstr "రూపు రేఖలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 +msgid "Page Setup" +msgstr "పేజీ అమరిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 +msgid "Chapter Detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 +msgid "No available formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 +msgid "Cannot convert %s as this book has no supported formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 +msgid "Choose the format to convert into LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 +msgid "Convert %s to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 +msgid "Set conversion defaults" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 +msgid "Cannot read" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 +msgid "You do not have permission to read the file: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 +msgid "Error reading file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 +msgid "<p>There was an error reading from file: <br /><b>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 +msgid " is not a valid picture" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +msgid "" +"Preprocess the file before converting to LRF. This is useful if you know " +"that the file is from a specific source. Known sources:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 +msgid "" +"<li><b>pdftohtml</b> - HTML files that are the output of the program " +"pdftohtml</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 +msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +msgid "" +"Specify metadata such as title and author for the book.<p>Metadata will be " +"updated in the database as well as the generated LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +msgid "" +"Adjust the look of the generated LRF file by specifying things like font " +"sizes and the spacing between words." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 +msgid "" +"Specify the page settings like margins and the screen size of the target " +"device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 +msgid "Fine tune the detection of chapter and section headings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 +msgid "<font color=\"gray\">No help available</font>" +msgstr "<font color=\"gray\">సహాయమేమీ అందుబాటులో లేదు</font>" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 +msgid "Bulk convert ebooks to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 +msgid "Convert to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +msgid "Category" +msgstr "వర్గం" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 +msgid "Options" +msgstr "ఎంపికలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +msgid "Book Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +msgid "Change &cover image:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +msgid "Browse for an image to use as the cover of this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 +msgid "Use cover from &source file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +msgid "&Title: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +msgid "Change the title of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +msgid "&Author(s): " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +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/lrf_single_ui.py:519 +msgid "Author So&rt:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +msgid "&Publisher: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +msgid "Change the publisher of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +msgid "Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +msgid "" +"Tags categorize the book. This is particularly useful while searching. " +"<br><br>They can be any words or phrases, separated by commas." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +msgid "&Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +msgid "List of known series. You can add new series." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +msgid "Series index." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +msgid "Book " +msgstr "పుస్తకం " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +msgid "Base &font size:" +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:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +msgid " pts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +msgid "Embedded Fonts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 +msgid "&Serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +msgid "S&ans-serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 +msgid "&Monospace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +msgid "Source en&coding:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 +msgid "Minimum &indent:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +msgid "&Word spacing:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +msgid "Enable auto &rotation of images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +msgid "Insert &blank lines between paragraphs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +msgid "Ignore &tables" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +msgid "Ignore &colors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +msgid "&Preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +msgid "Header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +msgid "&Show header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +msgid "&Header format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +msgid "Override<br>CSS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 +msgid "&Left Margin:" +msgstr "" + +#: /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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 +msgid " px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 +msgid "&Right Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 +msgid "&Top Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 +msgid "&Bottom Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 +msgid "Title based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 +msgid "&Disable chapter detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 +msgid "&Regular expression:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 +msgid "Add &chapters to table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 +msgid "Don't add &links to the table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 +msgid "Tag based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 +msgid "&Page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 +msgid "&Force page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 +msgid "Force page break before &attribute:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 +msgid "Help on item" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 +msgid "" +"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +"type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +"family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 +msgid "Edit Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +msgid "Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +msgid "Author S&ort: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +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:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +msgid "&Rating:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +msgid "Rating of this book. 0-5 stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +msgid " stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 +msgid "Add Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 +msgid "&Remove tags:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 +msgid "Comma separated list of tags to remove from the books. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +msgid "" +"<p>Enter your username and password for <b>LibraryThing.com</b>. <br/>If you " +"do not have one, you can <a href='http://www.librarything.com'>register</a> " +"for free!.</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "<b>Could not fetch cover.</b><br/>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "Could not fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "Cannot fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "You must specify the ISBN identifier for this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +msgid "Edit Meta Information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +msgid "Open Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Fetch metadata from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +msgid "Available Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +msgid "Add a new format for this book to the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +msgid "Remove the selected formats for this book from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +msgid "Fetch cover image from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +msgid "" +"Change the username and/or password for your account at LibraryThing.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +msgid "Change password" +msgstr "సంకేతపదం మార్చు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:55 +msgid "Password needed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 +msgid "&Username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 +msgid "&Password:" +msgstr "&సంకేతపదం:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 +msgid "&Show password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:15 +msgid "Author" +msgstr "రచయిత" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:17 +msgid "Tag" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 +msgid "Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:21 +msgid "Any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 +msgid "Form" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 +msgid "contains" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 +msgid "The text to search for. It is interpreted as a regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 +msgid "" +"<p>Negate this match. That is, only return results that <b>do not</b> match " +"this query." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39 +msgid "Negate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 +msgid "Advanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 +msgid "Match a&ll of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 +msgid "Match a&ny of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 +msgid "Search criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +msgid "More" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +msgid "Fewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 +msgid "Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 +msgid "A&vailable tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 +msgid "" +"Delete tag from database. This will unapply the tag from all books and then " +"remove it from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 +msgid "Apply tag to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 +msgid "A&pplied tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 +msgid "Unapply (remove) tag from current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +msgid "&Add tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +msgid "" +"If the tag you want is not in the available list, you can add it here. " +"Accepts a comma separated list of tags." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 +msgid "Add tag to available tags and apply it to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:63 +msgid "No recipe selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:69 +msgid "The attached file: %s is a recipe to download %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:70 +msgid "Recipe for " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 +msgid "Switch to Advanced mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 +msgid "Switch to Basic mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +msgid "Feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 +msgid "The feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +msgid "Feed must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 +msgid "The feed %s must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 +msgid "This feed has already been added to the recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 +msgid "A custom recipe named %s already exists. Do you want to replace it?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Choose a recipe file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 +msgid "Add custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 +msgid "Available user recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 +msgid "Add/Update &recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 +msgid "&Remove recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 +msgid "&Share recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 +msgid "&Load recipe from file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 +msgid "" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +"type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +"font-weight:400; font-style:normal;\">\n" +"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-" +"right:0px; -qt-block-indent:0; text-indent:0px;\">Create a basic news " +"recipe, by adding RSS feeds to it. <br />For most feeds, you will have to " +"use the \"Advanced mode\" to further customize the fetch " +"process.</p></body></html>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 +msgid "Recipe &title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 +msgid "&Oldest article:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 +msgid "The oldest article to download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 +msgid " days" +msgstr " రోజులు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 +msgid "&Max. number of articles per feed:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +msgid "Maximum number of articles to download per feed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +msgid "Feeds in recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +msgid "Remove feed from recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 +msgid "Add feed to recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +msgid "&Feed title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 +msgid "Feed &URL:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 +msgid "&Add feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +msgid "" +"For help with writing advanced news recipes, please visit <a " +"href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +msgid "Recipe source code (python)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 +msgid "" +"<p>Set a regular expression pattern to use when trying to guess ebook " +"metadata from filenames. <p>A <a href=\"http://docs.python.org/lib/re-" +"syntax.html\">reference</a> on the syntax of regular expressions is " +"available.<p>Use the <b>Test</b> functionality below to test your regular " +"expression on a few sample filenames." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:98 +msgid "Regular &expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:99 +msgid "&Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:100 +msgid "File &name:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:101 +msgid "Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:102 +msgid "Title:" +msgstr "శీర్షిక:" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:103 +msgid "Regular expression group name (?P<title>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:61 +msgid "No match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +msgid "Authors:" +msgstr "రచయితలు:" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +msgid "Regular expression group name (?P<authors>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108 +msgid "Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109 +msgid "Regular expression group name (?P<series>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +msgid "Series index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +msgid "Regular expression group name (?P<series_index>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 +msgid "ISBN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 +msgid "Job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 +msgid "Status" +msgstr "స్థితి" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 +msgid "Progress" +msgstr "ప్రగతి" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 +msgid "Running time" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Error" +msgstr "పొరపాటు" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Waiting" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 +msgid "Cannot kill job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 +msgid "" +"Cannot kill jobs that are communicating with the device as this may cause " +"data corruption." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 +msgid "Cannot kill already completed jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 +msgid "Cannot kill waiting jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +msgid "Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 +msgid "Double click to <b>edit</b> me<br><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 +msgid "Size (MB)" +msgstr "పరిమాణం (మెబై)" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 +msgid "Date" +msgstr "తేదీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 +msgid "Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +msgid "Configure Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +msgid "Use white background" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:50 +msgid "Hyphenate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:51 +msgid "<b>Changes will only take affect after a restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 +msgid " - LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "No matches found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128 +msgid "LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:129 +msgid "Parsing LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:130 +msgid "LRF Viewer toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 +msgid "Next Page" +msgstr "తర్వాతి పేజీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 +msgid "Previous Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133 +msgid "Back" +msgstr "వెనుకకు" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134 +msgid "Forward" +msgstr "ముందుకి" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135 +msgid "Next match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:136 +msgid "Open ebook" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137 +msgid "Configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +msgid "" +"<p>For help visit <a " +"href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 +msgid "Send to main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +msgid "Send to storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +msgid "Edit metadata individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +msgid "Edit metadata in bulk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +msgid "" +"Add books recursively (One book per directory, assumes every ebook file is " +"the same book in a different format)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +msgid "" +"Add books recursively (Multiple books per directory, assumes every ebook " +"file is a different book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +msgid "Save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +msgid "View" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 +msgid "Device database corrupted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +msgid "" +"\n" +" <p>The database of books on the reader is corrupted. Try the " +"following:\n" +" <ol>\n" +" <li>Unplug the reader. Wait for it to finish regenerating " +"the database (i.e. wait till it is ready to be used). Plug it back in. Now " +"it should work with %(app)s. If not try the next step.</li>\n" +" <li>Quit %(app)s. Find the file media.xml in the reader's " +"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +"file. Re-connect it and start %(app)s.</li>\n" +" </ol>\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 +msgid "" +"<p>Books with the same title as the following already exist in the database. " +"Add them anyway?<ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 +msgid "Duplicates found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 +msgid "No space on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 +msgid "" +"<p>Cannot upload books to device there is no more free space available " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 +msgid "Sending books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 +msgid "No suitable formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 +msgid "" +"Could not upload the following books to the device, as no suitable formats " +"were found:<br><ul>%s</ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 +msgid "Fetch news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 +msgid "News fetched. Uploading to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 +msgid "Starting Bulk conversion of %d books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +msgid "%s has no available formats." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure while there are running jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 +msgid "Copying database to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 +msgid "Invalid database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 +msgid "" +"<p>An invalid database already exists at %s, delete it before trying to move " +"the existing database.<br>Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 +msgid "Could not move database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 +msgid "No detailed info available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 +msgid "No detailed information is available for books on the device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 +msgid "Error talking to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 +msgid "Conversion Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "Database does not exist" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "" +"The directory in which the database should be: %s no longer exists. Please " +"choose a new database location." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 +msgid "" +"<span style=\"color:red; font-weight:bold\">Latest version: <a " +"href=\"%s\">%s</a></span>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "" +"%s has been updated to version %s. See the <a " +"href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " +"Visit the download page?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "Update available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +msgid "calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +msgid "Advanced search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +msgid "Alt+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +msgid "" +"Search the list of books by title or author<br><br>Words separated by spaces " +"are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +msgid "" +"Search the list of books by title, author, publisher, tags and " +"comments<br><br>Words separated by spaces are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 +msgid "Reset Quick Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +msgid "Add books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +msgid "Edit meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +msgid "E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +msgid "Send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +msgid "S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +msgid "Fetch news" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +msgid "F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +msgid "Convert E-books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +msgid "C" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 +msgid "V" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 +msgid "Add a custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 +msgid "" +"<p>Please enter your username and password for %s<br>If you do not have one, " +"please subscribe to get access to the articles.<br/> Click OK to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 +msgid "Custom news sources" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to browse books by their covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to turn off Cover Browsing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +msgid "" +"<p>Browsing books by their covers is disabled.<br>Import of pictureflow " +"module failed:<br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:38 +msgid "Invalid regular expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:39 +msgid "Invalid regular expression: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 +msgid "" +"Reader\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 +msgid "" +"Card\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 +msgid "Click to see the list of books available on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 +msgid "Click to see the list of books in the main memory of your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 +msgid "Click to see the list of books on the storage card in your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 +msgid "" +"Path to the calibre database. Default is to use the path stored in the " +"settings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 +msgid "" +"%prog list [options]\n" +"\n" +"List the books available in the calibre database. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +msgid "" +"The fields to display when listing books in the database. Should be a comma " +"separated list of fields.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +msgid "" +"The field by which to sort the results.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +msgid "Sort results in ascending order" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 +msgid "" +"Filter the results by the search query. For the format of the search query, " +"please see the search related documentation in the User Manual. Default is " +"to do no filtering." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 +msgid "Invalid fields. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 +msgid "Invalid sort field. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +msgid "" +"The following books were not added as they already exist in the database " +"(see --duplicates option):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +msgid "" +"%prog add [options] file1 file2 file3 ...\n" +"\n" +"Add the specified files as books to the database. You can also specify " +"directories, see\n" +"the directory related options below. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +msgid "" +"Assume that each directory has only a single logical book and that all files " +"in it are different e-book formats of that book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +msgid "Process directories recursively" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +msgid "" +"Add books to database even if they already exist. Comparison is done based " +"on book titles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +msgid "You must specify at least one file to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +msgid "" +"%prog remove ids\n" +"\n" +"Remove the books identified by ids from the database. ids should be a comma " +"separated list of id numbers (you can get id numbers by using the list " +"command). For example, 23,34,57-85\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +msgid "You must specify at least one book to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +msgid "" +"%prog add_format [options] id ebook_file\n" +"\n" +"Add the ebook in ebook_file to the available formats for the logical book " +"identified by id. You can get id by using the list command. If the format " +"already exists, it is replaced.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +msgid "You must specify an id and an ebook file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +msgid "ebook file must have an extension" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +msgid "" +"\n" +"%prog remove_format [options] id fmt\n" +"\n" +"Remove the format fmt from the logical book identified by id. You can get id " +"by using the list command. fmt should be a file extension like LRF or TXT or " +"EPUB. If the logical book does not have fmt available, do nothing.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +msgid "You must specify an id and a format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +msgid "" +"%%prog command [options] [arguments]\n" +"\n" +"%%prog is the command line interface to the calibre books database. \n" +"\n" +"command is one of:\n" +" %s\n" +" \n" +"For help on an individual command: %%prog command --help\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +msgid "Could not initialize the fontconfig library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 +msgid "URL must have the scheme sftp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:57 +msgid "host must be of the form user@hostname" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:68 +msgid "Failed to negotiate SSH session: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:71 +msgid "Failed to authenticate with server: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:77 +msgid "Unknown feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 +msgid "Untitled article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:15 +msgid "" +"%%prog [options] ARG\n" +"\n" +"%%prog parses an online source of articles, like an RSS or ATOM feed and \n" +"fetches the article contents organized in a nice hierarchy.\n" +"\n" +"ARG can be one of:\n" +"\n" +"file name - %%prog will try to load a recipe from the file\n" +"\n" +"builtin recipe title - %%prog will load the builtin recipe and use it to " +"fetch the feed. For e.g. Newsweek or \"The BBC\" or \"The New York Times\"\n" +"\n" +"recipe as a string - %%prog will load the recipe directly from the string " +"arg.\n" +"\n" +"Available builtin recipes are:\n" +"%s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37 +msgid "" +"Options to control web2disk (used to fetch websites linked from feeds)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:40 +msgid "" +"Specify a list of feeds to download. For example: \n" +"\"['http://feeds.newsweek.com/newsweek/TopNews', " +"'http://feeds.newsweek.com/headlines/politics']\"\n" +"If you specify this option, any argument to %prog is ignored and a default " +"recipe is used to download the feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 +msgid "Be more verbose while processing." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 +msgid "" +"The title for this recipe. Used as the title for any ebooks created from the " +"downloaded feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:47 +msgid "Username for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:48 +msgid "Password for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:51 +msgid "" +"Number of levels of links to follow on webpages that are linked to from " +"feeds. Defaul %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53 +msgid "" +"The directory in which to store the downloaded feeds. Defaults to the " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55 +msgid "Dont show the progress bar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 +msgid "Very verbose output, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 +msgid "" +"Useful for recipe development. Forces max_articles_per_feed to 2 and " +"downloads at most 2 feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:576 +msgid "Fetching feeds..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:33 +msgid "Unknown News Source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:474 +msgid "Download finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:476 +msgid "Failed to download the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:478 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:484 +msgid " from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:482 +msgid "Failed to download parts of the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:486 +msgid "\tFailed links:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:558 +msgid "Could not fetch article. Run with --debug to see the reason" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 +msgid "Got feeds from index page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 +msgid "Trying to download cover..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:636 +msgid "Starting download [%d thread(s)]..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:649 +msgid "Feeds downloaded to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:659 +msgid "Could not download cover: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:664 +msgid "Downloading cover from %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +msgid "Untitled Article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:743 +msgid "" +"\n" +"Downloaded article %s from %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 +msgid "Article downloaded: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:755 +msgid "Failed to download article: %s from %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 +msgid "Article download failed: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:775 +msgid "Fetching feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:382 +msgid "" +"%prog URL\n" +"\n" +"Where URL is for example http://google.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:385 +msgid "Base directory into which URL is saved. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:388 +msgid "" +"Timeout in seconds to wait for a response from the server. Default: %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:391 +msgid "" +"Maximum number of levels to recurse i.e. depth of links to follow. Default " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:394 +msgid "" +"The maximum number of files to download. This only applies to files from <a " +"href> tags. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:396 +msgid "" +"Minimum interval in seconds between consecutive fetches. Default is %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:398 +msgid "" +"The character encoding for the websites you are trying to download. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:400 +msgid "" +"Only links that match this regular expression will be followed. This option " +"can be specified multiple times, in which case as long as a link matches any " +"one regexp, it will be followed. By default all links are followed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:402 +msgid "" +"Any link that matches this regular expression will be ignored. This option " +"can be specified multiple times, in which case as long as any regexp matches " +"a link, it will be ignored.By default, no links are ignored. If both --" +"filter-regexp and --match-regexp are specified, then --filter-regexp is " +"applied first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:404 +msgid "Do not download CSS stylesheets." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:405 +msgid "Show detailed output information. Useful for debugging" +msgstr "" From 9dcf9200d0f0b9fafe09ba4376bc8090c5ae6bc7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 28 Jun 2008 14:36:39 -0700 Subject: [PATCH 36/54] Fix linux binary installer --- linux_installer.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/linux_installer.py b/linux_installer.py index 7556f438fb..e30e2bbeca 100644 --- a/linux_installer.py +++ b/linux_installer.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' ''' Create linux binary. ''' -import glob, sys, subprocess, tarfile, os, re +import glob, sys, subprocess, tarfile, os, re, py_compile HOME = '/home/kovid' PYINSTALLER = os.path.expanduser('~/build/pyinstaller') CALIBREPREFIX = '___' @@ -30,7 +30,7 @@ def run_pyinstaller(args=sys.argv): subprocess.check_call('make plugins', shell=True) cp = HOME+'/build/'+os.path.basename(os.getcwd()) spec = open(os.path.join(PYINSTALLER, 'calibre', 'calibre.spec'), 'wb') - raw = re.sub(r'CALIBREPREFIX\s+=\s+\'___\'', 'CALIBREPREFIX = '+repr(cp), + raw = re.sub(r'CALIBREPREFIX\s+=\s+\'___\'', 'CALIBREPREFIX = '+repr(cp), open(__file__).read()) spec.write(raw) spec.close() @@ -64,12 +64,14 @@ temp = ['keyword', 'codeop'] recipes = ['calibre', 'web', 'feeds', 'recipes'] prefix = '.'.join(recipes)+'.' +recipes_toc = [] +extra_toc = [ + ('keyword', '/usr/lib/python2.5/keyword.pyo', 'PYSOURCE'), + ('codeop', '/usr/lib/python2.5/codeop.pyo', 'PYSOURCE') + ] for f in glob.glob(os.path.join(CALIBRESRC, *(recipes+['*.py']))): - temp.append(prefix + os.path.basename(f).partition('.')[0]) -hook = os.path.expanduser('~/temp/hook-calibre.py') -f = open(hook, 'wb') -hook_script = 'hiddenimports = %s'%repr(temp) -f.write(hook_script) + py_compile.compile(f, doraise=True) + recipes_toc.append((prefix + os.path.basename(f).partition('.')[0], f+'o', 'PYSOURCE')) sys.path.insert(0, CALIBRESRC) from calibre.linux import entry_points @@ -82,18 +84,19 @@ for entry in entry_points['console_scripts'] + entry_points['gui_scripts']: executables.append(fields[0].strip()) scripts.append(os.path.join(CALIBRESRC, *map(lambda x: x.strip(), fields[1].split(':')[0].split('.')))+'.py') -recipes = Analysis(glob.glob(os.path.join(CALIBRESRC, 'calibre', 'web', 'feeds', 'recipes', '*.py')), - pathex=[CALIBRESRC], hookspath=[os.path.dirname(hook)], excludes=excludes) analyses = [Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), loader, script], pathex=[PYINSTALLER, CALIBRESRC, CALIBREPLUGINS], excludes=excludes) for script in scripts] pyz = TOC() binaries = TOC() +pyz += extra_toc +pyz += recipes_toc + for a in analyses: pyz = a.pure + pyz binaries = a.binaries + binaries -pyz = PYZ(pyz + recipes.pure, name='library.pyz') +pyz = PYZ(pyz, name='library.pyz') built_executables = [] for script, exe, a in zip(scripts, executables, analyses): From b67305911ff6b722f73e4c4d72d906f59da29667 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 28 Jun 2008 14:38:30 -0700 Subject: [PATCH 37/54] Refactor the entire OPF handling framework and embed genshi --- src/calibre/__init__.py | 11 +- src/calibre/ebooks/lrf/epub/convert_from.py | 6 +- src/calibre/ebooks/lrf/html/convert_from.py | 2 +- src/calibre/ebooks/lrf/lit/convert_from.py | 2 +- src/calibre/ebooks/metadata/__init__.py | 141 +- src/calibre/ebooks/metadata/lit.py | 8 +- src/calibre/ebooks/metadata/opf.py | 596 ++++---- src/calibre/ebooks/metadata/opf.xml | 29 +- src/calibre/ebooks/metadata/toc.py | 9 +- src/calibre/ebooks/mobi/reader.py | 17 +- src/calibre/gui2/main.py | 5 +- src/calibre/gui2/main_window.py | 2 - src/calibre/linux.py | 2 +- src/calibre/trac/plugins/download.py | 3 +- src/calibre/utils/genshi/__init__.py | 29 + src/calibre/utils/genshi/builder.py | 362 +++++ src/calibre/utils/genshi/core.py | 705 +++++++++ src/calibre/utils/genshi/filters/__init__.py | 20 + src/calibre/utils/genshi/filters/html.py | 397 +++++ src/calibre/utils/genshi/filters/i18n.py | 528 +++++++ src/calibre/utils/genshi/filters/transform.py | 1309 +++++++++++++++++ src/calibre/utils/genshi/input.py | 449 ++++++ src/calibre/utils/genshi/output.py | 765 ++++++++++ src/calibre/utils/genshi/path.py | 1170 +++++++++++++++ src/calibre/utils/genshi/template/__init__.py | 23 + src/calibre/utils/genshi/template/base.py | 598 ++++++++ .../utils/genshi/template/directives.py | 745 ++++++++++ src/calibre/utils/genshi/template/eval.py | 823 +++++++++++ .../utils/genshi/template/interpolation.py | 151 ++ src/calibre/utils/genshi/template/loader.py | 328 +++++ src/calibre/utils/genshi/template/markup.py | 305 ++++ src/calibre/utils/genshi/template/plugin.py | 176 +++ src/calibre/utils/genshi/template/text.py | 333 +++++ src/calibre/utils/genshi/util.py | 250 ++++ src/calibre/web/feeds/news.py | 7 +- src/calibre/web/feeds/templates.py | 12 +- 36 files changed, 9919 insertions(+), 399 deletions(-) create mode 100644 src/calibre/utils/genshi/__init__.py create mode 100644 src/calibre/utils/genshi/builder.py create mode 100644 src/calibre/utils/genshi/core.py create mode 100644 src/calibre/utils/genshi/filters/__init__.py create mode 100644 src/calibre/utils/genshi/filters/html.py create mode 100644 src/calibre/utils/genshi/filters/i18n.py create mode 100644 src/calibre/utils/genshi/filters/transform.py create mode 100644 src/calibre/utils/genshi/input.py create mode 100644 src/calibre/utils/genshi/output.py create mode 100644 src/calibre/utils/genshi/path.py create mode 100644 src/calibre/utils/genshi/template/__init__.py create mode 100644 src/calibre/utils/genshi/template/base.py create mode 100644 src/calibre/utils/genshi/template/directives.py create mode 100644 src/calibre/utils/genshi/template/eval.py create mode 100644 src/calibre/utils/genshi/template/interpolation.py create mode 100644 src/calibre/utils/genshi/template/loader.py create mode 100644 src/calibre/utils/genshi/template/markup.py create mode 100644 src/calibre/utils/genshi/template/plugin.py create mode 100644 src/calibre/utils/genshi/template/text.py create mode 100644 src/calibre/utils/genshi/util.py diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 674302bf6d..e619d00a31 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -398,9 +398,10 @@ def relpath(target, base=os.curdir): Base can be a directory specified either as absolute or relative to current dir. """ - if not os.path.exists(target): - raise OSError, 'Target does not exist: '+target - + #if not os.path.exists(target): + # raise OSError, 'Target does not exist: '+target + if target == base: + raise ValueError('target and base are both: %s'%target) if not os.path.isdir(base): raise OSError, 'Base is not a directory or does not exist: '+base @@ -408,13 +409,13 @@ def relpath(target, base=os.curdir): target_list = (os.path.abspath(target)).split(os.sep) # On the windows platform the target may be on a completely different drive from the base. - if iswindows and base_list[0] <> target_list[0]: + if iswindows and base_list[0] != target_list[0]: raise OSError, 'Target is on a different drive to base. Target: '+target_list[0].upper()+', base: '+base_list[0].upper() # Starting from the filepath root, work out how much of the filepath is # shared by base and target. for i in range(min(len(base_list), len(target_list))): - if base_list[i] <> target_list[i]: break + if base_list[i] != target_list[i]: break else: # If we broke out of the loop, i is pointing to the first differing path elements. # If we didn't break out of the loop, i is pointing to identical path elements. diff --git a/src/calibre/ebooks/lrf/epub/convert_from.py b/src/calibre/ebooks/lrf/epub/convert_from.py index 4dc531f86b..701681243e 100644 --- a/src/calibre/ebooks/lrf/epub/convert_from.py +++ b/src/calibre/ebooks/lrf/epub/convert_from.py @@ -29,7 +29,7 @@ def generate_html(pathtoepub, logger): zip_extract(pathtoepub, tdir) except: if os.path.exists(tdir) and os.path.isdir(tdir): - shutil.rmtree(tdir) + shutil.rmtree(tdir) raise ConversionError, '.epub extraction failed' return tdir @@ -42,7 +42,7 @@ def process_file(path, options, logger=None): tdir = generate_html(epub, logger) try: ocf = OCFDirReader(tdir) - htmlfile = ocf.opf.spine.items().next().href + htmlfile = ocf.opf.spine[0].path options.opf = os.path.join(tdir, ocf.container[OPF.MIMETYPE]) if not options.output: ext = '.lrs' if options.lrs else '.lrf' @@ -61,7 +61,7 @@ def process_file(path, options, logger=None): def main(args=sys.argv, logger=None): parser = option_parser() options, args = parser.parse_args(args) - if len(args) != 2: + if len(args) != 2: parser.print_help() print print 'No epub file specified' diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index a69b47bab0..27bf152597 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -1969,7 +1969,7 @@ def try_opf(path, options, logger): continue if not getattr(options, 'cover', None) and orig_cover is not None: options.cover = orig_cover - options.spine = [i.href for i in opf.spine.items()] + options.spine = [i.path for i in opf.spine if i.path] if not getattr(options, 'toc', None): options.toc = opf.toc except Exception: diff --git a/src/calibre/ebooks/lrf/lit/convert_from.py b/src/calibre/ebooks/lrf/lit/convert_from.py index d93eaf9534..3d8a3f97b0 100644 --- a/src/calibre/ebooks/lrf/lit/convert_from.py +++ b/src/calibre/ebooks/lrf/lit/convert_from.py @@ -57,7 +57,7 @@ def process_file(path, options, logger=None): if opf: path = opf[0] opf = OPFReader(path) - htmlfile = opf.spine.items().next().href.replace('&', '%26') #convertlit replaces & with %26 + htmlfile = opf.spine[0].path.replace('&', '%26') #convertlit replaces & with %26 options.opf = path else: l = glob.glob(os.path.join(tdir, '*toc*.htm*')) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index f744bb7f41..eacc4f04e0 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -1,14 +1,17 @@ +#!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + """ -Provides metadata editing support for PDF and RTF files. For LRF metadata, use -the L{lrf.meta} module. +Provides abstraction for metadata reading.writing from a variety of ebook formats. """ -__docformat__ = "epytext" -__author__ = "Kovid Goyal <kovid@kovidgoyal.net>" +import os, mimetypes +from urllib import unquote, quote +from urlparse import urlparse -from calibre import __version__ as VERSION +from calibre import __version__ as VERSION, relpath from calibre import OptionParser def get_parser(extension): @@ -24,6 +27,125 @@ def get_parser(extension): help=_('Set the comment')) return parser +class Resource(object): + ''' + Represents a resource (usually a file on the filesystem or a URL pointing + to the web. Such resources are commonly referred to in OPF files. + + They have the interface: + + :member:`path` + :member:`mime_type` + :method:`href` + + ''' + + def __init__(self, href_or_path, basedir=os.getcwd(), is_path=True): + self._href = None + self._basedir = None + self.path = None + self.fragment = '' + try: + self.mime_type = mimetypes.guess_type(href_or_path)[0] + except: + self.mime_type = None + if self.mime_type is None: + self.mime_type = 'application/octet-stream' + if is_path: + path = href_or_path + if not os.path.isabs(path): + path = os.path.abspath(os.path.join(path, basedir)) + self.path = path + else: + url = urlparse(href_or_path) + if url[0] not in ('', 'file'): + self._href = href_or_path + else: + self.path = os.path.abspath(os.path.join(basedir, unquote(url[2]).replace('/', os.sep))) + self.fragment = unquote(url[-1]) + + + def href(self, basedir=None): + ''' + Return a URL pointing to this resource. If it is a file on the filesystem + the URL is relative to `basedir`. + + `basedir`: If None, the basedir of this resource is used (see :method:`set_basedir`). + If this resource has no basedir, then the current working directory is used as the basedir. + ''' + if basedir is None: + if self._basedir: + basedir = self._basedir + else: + basedir = os.getcwd() + if self.path is None: + return self._href + frag = '#'+quote(self.fragment) if self.fragment else '' + if self.path == basedir: + return ''+frag + rpath = relpath(self.path, basedir) + + return quote(rpath.replace(os.sep, '/'))+frag + + def set_basedir(self, path): + self._basedir = path + + def basedir(self): + return self._basedir + + def __repr__(self): + return 'Resource(%s, %s)'%(repr(self.path), repr(self.href())) + + +class ResourceCollection(object): + + def __init__(self): + self._resources = [] + + def __iter__(self): + for r in self._resources: + yield r + + def __len__(self): + return len(self._resources) + + def __getitem__(self, index): + return self._resources[index] + + def __bool__(self): + return len(self._resources) > 0 + + def __str__(self): + resources = map(repr, self) + return '[%s]'%', '.join(resources) + + def __repr__(self): + return str(self) + + def append(self, resource): + if not isinstance(resource, Resource): + raise ValueError('Can only append objects of type Resource') + self._resources.append(resource) + + def remove(self, resource): + self._resources.remove(resource) + + @staticmethod + def from_directory_contents(top, topdown=True): + collection = ResourceCollection() + for spec in os.walk(top, topdown=topdown): + path = os.path.abspath(os.path.join(spec[0], spec[1])) + res = Resource.from_path(path) + res.set_basedir(top) + collection.append(res) + return collection + + def set_basedir(self, path): + for res in self: + res.set_basedir(path) + + + class MetaInformation(object): '''Convenient encapsulation of book metadata''' @@ -32,7 +154,7 @@ class MetaInformation(object): ans = MetaInformation(mi.title, mi.authors) for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'tags', 'cover_data', 'application_id', + 'isbn', 'tags', 'cover_data', 'application_id', 'guide', 'manifest', 'spine', 'toc', 'cover', 'language'): if hasattr(mi, attr): setattr(ans, attr, getattr(mi, attr)) @@ -70,6 +192,7 @@ class MetaInformation(object): self.manifest = getattr(mi, 'manifest', None) self.toc = getattr(mi, 'toc', None) self.spine = getattr(mi, 'spine', None) + self.guide = getattr(mi, 'guide', None) self.cover = getattr(mi, 'cover', None) def smart_update(self, mi): @@ -86,7 +209,7 @@ class MetaInformation(object): for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'application_id', 'manifest', 'spine', 'toc', - 'cover', 'language'): + 'cover', 'language', 'guide'): if hasattr(mi, attr): val = getattr(mi, attr) if val is not None: @@ -116,7 +239,7 @@ class MetaInformation(object): if self.tags: ans += u'Tags : ' +unicode(self.tags) + '\n' if self.series: - ans += u'Series : '+unicode(self.series) + '(%d)'%self.series_index + ans += u'Series : '+unicode(self.series) + ' #%d\n'%self.series_index if self.language: ans += u'Language : ' + unicode(self.language) + u'\n' return ans.strip() diff --git a/src/calibre/ebooks/metadata/lit.py b/src/calibre/ebooks/metadata/lit.py index 892acec3f5..2b8c3a4b9f 100644 --- a/src/calibre/ebooks/metadata/lit.py +++ b/src/calibre/ebooks/metadata/lit.py @@ -5,7 +5,9 @@ Support for reading the metadata from a lit file. ''' import sys, struct, cStringIO, os +from itertools import repeat +from calibre import relpath from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf import OPFReader @@ -188,7 +190,7 @@ class UnBinary(object): def write_spaces(self, depth): - self.buf.write(u' '.join(u'' for i in range(depth))) + self.buf.write(u''.join(repeat(' ', depth))) def item_path(self, internal_id): for i in self.manifest: @@ -692,6 +694,7 @@ class LitFile(object): try: self._stream.seek(self.content_offset + entry.offset) raw = self._stream.read(entry.size) + xml = \ '''\ <?xml version="1.0" encoding="UTF-8" ?> @@ -721,9 +724,10 @@ def get_metadata(stream): try: litfile = LitFile(stream) src = litfile.meta.encode('utf-8') - mi = OPFReader(cStringIO.StringIO(src)) + mi = OPFReader(cStringIO.StringIO(src), dir=os.getcwd()) cover_url, cover_item = mi.cover, None if cover_url: + cover_url = relpath(cover_url, os.getcwd()) for item in litfile.manifest: if item.path == cover_url: cover_item = item.internal diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index 51b392c70f..df84bc59da 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -1,93 +1,205 @@ +import cStringIO __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' import uuid '''Read/Write metadata from Open Packaging Format (.opf) files.''' -import sys, re, os, mimetypes -from urllib import unquote -from urlparse import urlparse -import xml.dom.minidom as dom -from itertools import repeat +import sys, re, os, glob from calibre import __appname__ from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup +from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, BeautifulSoup from calibre.ebooks.lrf import entity_to_unicode -from calibre.ebooks.metadata import get_parser +from calibre.ebooks.metadata import get_parser, Resource, ResourceCollection from calibre.ebooks.metadata.toc import TOC -class ManifestItem(object): - def __init__(self, item, cwd): - self.id = item['id'] if item.has_key('id') else '' - self.href = urlparse(unquote(item['href']))[2] if item.has_key('href') else '' - if not os.path.isabs(self.href): - self.href = os.path.join(cwd, self.href) - self.href = os.path.normpath(self.href) - if not os.path.exists(self.href): # Bug in Baen OPF files - nhref = os.path.join(os.path.dirname(self.href), os.path.basename(self.href).replace('__p_.htm', '__c_.htm')) - if os.path.exists(nhref): - self.href = nhref - self.media_type = item['media-type'] if item.has_key('media-type') else '' +class OPFSoup(BeautifulStoneSoup): + + def __init__(self, raw): + BeautifulStoneSoup.__init__(self, raw, + convertEntities=BeautifulSoup.HTML_ENTITIES, + selfClosingTags=['item', 'itemref', 'reference']) + +class ManifestItem(Resource): + + @staticmethod + def from_opf_manifest_item(item, basedir): + if item.has_key('href'): + res = ManifestItem(item['href'], basedir=basedir, is_path=False) + mt = item.get('media-type', '').strip() + if mt: + res.mime_type = mt + return res + + @apply + def media_type(): + def fget(self): + return self.mime_type + def fset(self, val): + self.mime_type = val + return property(fget=fget, fset=fset) + def __unicode__(self): - return u'<item id="%s" href="%s" media-type="%s" />'%(self.id, self.href, self.media_type) + return u'<item id="%s" href="%s" media-type="%s" />'%(self.id, self.href(), self.media_type) + + def __str__(self): + return unicode(self).encode('utf-8') + + def __repr__(self): + return unicode(self) + def __getitem__(self, index): if index == 0: - return self.href + return self.href() if index == 1: return self.media_type raise IndexError('%d out of bounds.'%index) -class Manifest(list): +class Manifest(ResourceCollection): - def __init__(self, soup, dir): - manifest = soup.find('manifest') - if manifest is not None: - for item in manifest.findAll('item'): - self.append(ManifestItem(item, dir)) + @staticmethod + def from_opf_manifest_element(manifest, dir): + m = Manifest() + for item in manifest.findAll('item'): + try: + m.append(ManifestItem.from_opf_manifest_item(item, dir)) + id = item.get('id', '') + if not id: + id = 'id%d'%m.next_id + m[-1].id = id + m.next_id += 1 + except ValueError: + continue + return m + + @staticmethod + def from_paths(entries): + ''' + `entries`: List of (path, mime-type) If mime-type is None it is autodetected + ''' + m = Manifest() + for path, mt in entries: + mi = ManifestItem(path, is_path=True) + if mt: + mi.mime_type = mt + mi.id = 'id%d'%m.next_id + m.next_id += 1 + m.append(mi) + return m + + def __init__(self): + ResourceCollection.__init__(self) + self.next_id = 1 + def item(self, id): for i in self: if i.id == id: - return i + return i + + def id_for_path(self, path): + path = os.path.normpath(os.path.abspath(path)) + for i in self: + if i.path and os.path.normpath(i.path) == path: + return i.id + + def path_for_id(self, id): + for i in self: + if i.id == id: + return i.path -class Spine(object): +class Spine(ResourceCollection): - def __init__(self, soup, manifest): + class Item(Resource): + + def __init__(self, idfunc, *args, **kwargs): + Resource.__init__(self, *args, **kwargs) + self.is_linear = True + self.id = idfunc(self.path) + + @staticmethod + def from_opf_spine_element(spine, manifest): + s = Spine(manifest) + for itemref in spine.findAll('itemref'): + if itemref.has_key('idref'): + r = Spine.Item(s.manifest.id_for_path, + s.manifest.path_for_id(itemref['idref']), is_path=True) + r.is_linear = itemref.get('linear', 'yes') == 'yes' + s.append(r) + return s + + @staticmethod + def from_paths(paths, manifest): + s = Spine(manifest) + for path in paths: + try: + s.append(Spine.Item(s.manifest.id_for_path, path, is_path=True)) + except: + continue + return s + + + + def __init__(self, manifest): + ResourceCollection.__init__(self) self.manifest = manifest - self.linear_ids, self.nonlinear_ids = [], [] - spine = soup.find('spine') - if spine is not None: - for itemref in spine.findAll('itemref'): - if itemref.has_key('idref'): - if itemref.get('linear', 'yes') == 'yes': - self.linear_ids.append(itemref['idref']) - else: - self.nonlinear_ids.append(itemref['idref']) + def linear_items(self): - for id in self.linear_ids: - yield self.manifest.item(id) - + for r in self: + if r.is_linear: + yield r.path def nonlinear_items(self): - for id in self.nonlinear_ids: - yield self.manifest.item(id) - - + for r in self: + if not r.is_linear: + yield r.path + def items(self): - for i in self.linear_ids + self.nonlinear_ids: - mi = self.manifest.item(i) - if getattr(mi, 'href', None): - yield mi - - def __iter__(self): - for i in self.linear_ids + self.nonlinear_ids: - yield i - + for i in self: + yield i.path + +class Guide(ResourceCollection): + + class Reference(Resource): + + @staticmethod + def from_opf_resource_item(ref, basedir): + title, href, type = ref.get('title', ''), ref['href'], ref['type'] + res = Guide.Reference(href, basedir, is_path=False) + res.title = title + res.type = type + return res + + def __repr__(self): + ans = '<reference type="%s" href="%s" '%(self.type, self.href()) + if self.title: + ans += 'title="%s" '%self.title + return ans + '/>' + + + @staticmethod + def from_opf_guide(guide_elem, base_dir=os.getcwdu()): + coll = Guide() + for ref in guide_elem.findAll('reference'): + try: + ref = Guide.Reference.from_opf_resource_item(ref, base_dir) + coll.append(ref) + except: + continue + return coll + + def set_cover(self, path): + map(self.remove, [i for i in self if 'cover' in i.type.lower()]) + for type in ('cover', 'other.ms-coverimage-standard', 'other.ms-coverimage'): + self.append(Guide.Reference(path, is_path=True)) + self[-1].type = type + self[-1].title = '' + class standard_field(object): @@ -97,8 +209,6 @@ class standard_field(object): def __get__(self, obj, typ=None): return getattr(obj, 'get_'+self.name)() - def __set__(self, obj, val): - getattr(obj, 'set_'+self.name)(val) class OPF(MetaInformation): @@ -109,6 +219,7 @@ class OPF(MetaInformation): application_id = standard_field('application_id') title = standard_field('title') authors = standard_field('authors') + language = standard_field('language') title_sort = standard_field('title_sort') author_sort = standard_field('author_sort') comments = standard_field('comments') @@ -121,93 +232,15 @@ class OPF(MetaInformation): rating = standard_field('rating') tags = standard_field('tags') - HEADER = '''\ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE package - PUBLIC "+//ISBN 0-9673008-1-9//DTD OEB 1.2 Package//EN" - "http://openebook.org/dtds/oeb-1.2/oebpkg12.dtd"> -''' def __init__(self): raise NotImplementedError('Abstract base class') - def _initialize(self): - if not hasattr(self, 'soup'): - self.soup = BeautifulStoneSoup(u'''\ -%s -<package unique-identifier="%s_id"> - <metadata> - <dc-metadata - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/" /> - </metadata> -</package> -'''%(__appname__, self.HEADER)) - - def _commit(self, doc): - self.soup = BeautifulStoneSoup(doc.toxml('utf-8'), fromEncoding='utf-8') - - def _find_element(self, package, name, attrs=[]): - tags = package.getElementsByTagName(name) - for tag in tags: - match = True - for attr, vattr in attrs: - if tag.getAttribute(attr) != vattr: - match = False - break - if match: - return tag - return None - - def _set_metadata_element(self, name, value, attrs=[], - type='dc-metadata', replace=False): - self._initialize() - if isinstance(value, basestring): - value = [value] - attrs = [attrs] - - doc = dom.parseString(self.soup.__str__('UTF-8').strip()) - package = doc.documentElement - metadata = package.getElementsByTagName('metadata')[0] - - dcms = metadata.getElementsByTagName(type) - if dcms: - dcm = dcms[0] - else: - dcm = doc.createElement(type) - metadata.appendChild(dcm) - metadata.appendChild(doc.createTextNode('\n')) - tags = dcm.getElementsByTagName(name) - if tags and not replace: - for tag in tags: - tag.parentNode.removeChild(tag) - tag.unlink() - - for val, vattrs in zip(value, attrs): - if replace: - el = self._find_element(package, name, vattrs) - if el: - el.parentNode.removeChild(el) - el.unlink() - el = doc.createElement(name) - el.appendChild(doc.createTextNode(val)) - for attr, vattr in vattrs: - el.setAttribute(attr, vattr) - dcm.appendChild(el) - dcm.appendChild(doc.createTextNode('\n')) - self._commit(doc) - - def get_title(self): title = self.soup.package.metadata.find('dc:title') if title: return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip() return self.default_title.strip() - def set_title(self, title): - if not title: - title = 'Unknown' - self._set_metadata_element('dc:title', title) - def get_authors(self): creators = self.soup.package.metadata.findAll('dc:creator') for elem in creators: @@ -225,12 +258,6 @@ class OPF(MetaInformation): return [a.strip() for a in ans] return [] - def set_authors(self, authors): - if not authors: - authors = ['Unknown'] - attrs = list(repeat([('role', 'aut')], len(authors))) - self._set_metadata_element('dc:creator', authors, attrs) - def get_author_sort(self): creators = self.soup.package.metadata.findAll('dc:creator') for elem in creators: @@ -242,18 +269,6 @@ class OPF(MetaInformation): return self.ENTITY_PATTERN.sub(entity_to_unicode, fa).strip() if fa else None return None - def set_author_sort(self, aus): - if not aus: - aus = '' - self._initialize() - if not self.authors: - self.set_authors([]) - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - aut = package.getElementsByTagName('dc:creator')[0] - aut.setAttribute('file-as', aus) - self._commit(doc) - def get_title_sort(self): title = self.soup.package.find('dc:title') if title: @@ -261,61 +276,29 @@ class OPF(MetaInformation): return title['file-as'].strip() return None - def set_title_sort(self, title_sort): - if not title_sort: - title_sort = '' - self._initialize() - if not self.title: - self.title = None - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - tit = package.getElementsByTagName('dc:title')[0] - tit.setAttribute('file-as', title_sort) - self._commit(doc) - def get_comments(self): comments = self.soup.find('dc:description') if comments: return self.ENTITY_PATTERN.sub(entity_to_unicode, comments.string).strip() return None - def set_comments(self, comments): - if not comments: - comments = '' - self._set_metadata_element('dc:description', comments) - def get_uid(self): package = self.soup.find('package') if package.has_key('unique-identifier'): return package['unique-identifier'] - def set_uid(self, uid): - package = self.soup.find('package') - package['unique-identifier'] = str(uid) - def get_category(self): category = self.soup.find('dc:type') if category: return self.ENTITY_PATTERN.sub(entity_to_unicode, category.string).strip() return None - def set_category(self, category): - if not category: - category = '' - self._set_metadata_element('dc:type', category) - def get_publisher(self): publisher = self.soup.find('dc:publisher') if publisher: return self.ENTITY_PATTERN.sub(entity_to_unicode, publisher.string).strip() return None - def set_publisher(self, category): - if not category: - category = 'Unknown' - self._set_metadata_element('dc:publisher', category) - - def get_isbn(self): for item in self.soup.package.metadata.findAll('dc:identifier'): scheme = item.get('scheme') @@ -325,51 +308,27 @@ class OPF(MetaInformation): return str(item.string).strip() return None - def set_isbn(self, isbn): - if isbn: - self._set_metadata_element('dc:identifier', isbn, [('scheme', 'ISBN')], - replace=True) - + def get_language(self): + item = self.soup.package.metadata.find('dc:language') + if not item: + return _('Unknown') + return ''.join(item.findAll(text=True)).strip() + def get_application_id(self): for item in self.soup.package.metadata.findAll('dc:identifier'): if item.has_key('scheme') and item['scheme'] == __appname__: return str(item.string).strip() return None - def set_application_id(self, val): - if val: - self._set_metadata_element('dc:identifier', str(val), [('scheme', __appname__), ('id', __appname__+'_id')], - replace=True) - def get_cover(self): - guide = self.soup.package.find('guide') - if guide: - references = guide.findAll('reference') - for reference in references: - type = reference.get('type') - if not type: - continue - if type.lower() in ['cover', 'other.ms-coverimage-standard', "other.ms-coverimage"]: - return reference.get('href') - return None - - def set_cover(self, path, type='cover'): - self._initialize() - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - guide = package.getElementsByTagName('guide') - if guide: - guide = guide[0] - else: - guide = doc.createElement('guide') - package.appendChild(guide) - el = self._find_element(guide, 'reference', [('type', type)]) - if not el: - el = doc.createElement('reference') - guide.appendChild(el) - el.setAttribute('type', type) - el.setAttribute('href', path) - self._commit(doc) + guide = getattr(self, 'guide', []) + if not guide: + guide = [] + references = [ref for ref in guide if 'cover' in ref.type.lower()] + for candidate in ('cover', 'other.ms-coverimage-standard', 'other.ms-coverimage'): + matches = [r for r in references if r.type.lower() == candidate and r.path] + if matches: + return matches[0].path def possible_cover_prefixes(self): isbn, ans = [], [] @@ -388,11 +347,6 @@ class OPF(MetaInformation): return str(s.string).strip() return None - def set_series(self, val): - if not val: - val = '' - self._set_metadata_element('series', val, type='x-metadata') - def get_series_index(self): s = self.soup.package.metadata.find('series-index') if s: @@ -402,11 +356,6 @@ class OPF(MetaInformation): return None return None - def set_series_index(self, val): - if not val: - val = 1 - self._set_metadata_element('series-index', str(val), type='x-metadata') - def get_rating(self): xm = self.soup.package.metadata.find('x-metadata') if not xm: @@ -419,11 +368,6 @@ class OPF(MetaInformation): return None return None - def set_rating(self, val): - if not val: - val = 0 - self._set_metadata_element('rating', str(val), type='x-metadata') - def get_tags(self): ans = [] subs = self.soup.findAll('dc:subject') @@ -433,42 +377,7 @@ class OPF(MetaInformation): ans.append(val) return [unicode(a).strip() for a in ans] - def set_tags(self, tags): - self._set_metadata_element('dc:subject', tags) - - def write(self, stream): - from lxml import etree - root = etree.fromstring(unicode(self.soup)) - root.text = '\n%4s'%' ' - for child in root: - child.text = '\n%8s'%' ' - child.tail = '\n%4s'%' ' if child is not root[-1] else '\n' - for grandchild in child: - grandchild.tail = '\n%8s'%' ' if grandchild is not child[-1] else '\n%4s'%' ' - - metadata = root.find('metadata') - if metadata is not None: - for parent in ['dc-metadata', 'x-metadata']: - parent = metadata.find(parent) - if parent is None: - continue - parent.text = '\n%12s'%' ' - for child in parent: - child.tail = '\n%8s'%' ' if child is parent[-1] else '\n%12s'%' ' - - def fix_self_closing_tags(el): - ''' Makes tags that have only whitespace content self closing ''' - if len(el) == 0 and (el.text is None or el.text.strip() == ''): - el.text = None - for child in el: - fix_self_closing_tags(child) - - fix_self_closing_tags(root) - - raw = self.HEADER + etree.tostring(root, encoding='UTF-8') - - stream.write(raw+'\n') - + class OPFReader(OPF): def __init__(self, stream, dir=os.getcwdu()): @@ -480,15 +389,27 @@ class OPFReader(OPF): self.default_title = stream.name if hasattr(stream, 'name') else 'Unknown' if hasattr(stream, 'seek'): stream.seek(0) - self.soup = BeautifulStoneSoup(stream.read()) + self.soup = OPFSoup(stream.read()) if manage: stream.close() - self.manifest = Manifest(self.soup, dir) - self.spine = Spine(self.soup, self.manifest) + self.manifest = Manifest() + m = self.soup.find('manifest') + if m is not None: + self.manifest = Manifest.from_opf_manifest_element(m, dir) + self.spine = None + spine = self.soup.find('spine') + if spine is not None: + self.spine = Spine.from_opf_spine_element(spine, self.manifest) + self.toc = TOC(base_path=dir) self.toc.read_from_opf(self) + guide = self.soup.find('guide') + if guide is not None: + self.guide = Guide.from_opf_guide(guide, dir) + self.base_dir = dir self.cover_data = (None, None) + class OPFCreator(MetaInformation): def __init__(self, base_path, *args, **kwargs): @@ -502,47 +423,34 @@ class OPFCreator(MetaInformation): self.base_path = os.path.abspath(base_path) if self.application_id is None: self.application_id = str(uuid.uuid4()) - self.toc = None - if isinstance(self.manifest, Manifest): - manifest = [] - for path, mt in self.manifest: - if not path.startswith(self.base_path): - raise ValueError('Inavlid manifest item %s for base path %s'%(path, self.base_path)) - path = path[len(self.base_path)+1:] - manifest.append((path, mt)) - self.manifest = manifest + if not isinstance(self.toc, TOC): + self.toc = None if not self.authors: self.authors = [_('Unknown')] - + if self.guide is None: + self.guide = Guide() + if self.cover: + self.guide.set_cover(self.cover) + + def create_manifest(self, entries): ''' Create <manifest> - @param entries: List of (path, mime-type) - @param base_path: It is used to convert each path into a path relative to itself - @type entries: list of 2-tuples + + `entries`: List of (path, mime-type) If mime-type is None it is autodetected ''' - rentries = [] - base_path = self.base_path - mimetypes.init() - for href, mt in entries: - href = os.path.abspath(href) - if not href.startswith(base_path): - raise ValueError('OPF should only refer to files below it. %s is above %s'%(href, base_path)) - href = href[len(base_path)+1:].replace(os.sep, '/') - if not mt: - mt = mimetypes.guess_type(href)[0] - if not mt: - mt = '' - rentries.append((href, mt)) - - self.manifest = rentries + entries = map(lambda x: x if os.path.isabs(x[0]) else + (os.path.abspath(os.path.join(self.base_path, x[0])), x[1]), + entries) + self.manifest = Manifest.from_paths(entries) + self.manifest.set_basedir(self.base_path) def create_manifest_from_files_in(self, files_and_dirs): - #self.base_path = os.path.commonprefix(files_and_dirs) entries = [] def dodir(dir): - for root, dirs, files in os.walk(dir): + for spec in os.walk(dir): + root, files = spec[0], spec[-1] for name in files: path = os.path.join(root, name) if os.path.isfile(path): @@ -558,47 +466,48 @@ class OPFCreator(MetaInformation): def create_spine(self, entries): ''' - Create the <spine> element. Must first call L{create_manifest}. - @param: List of paths - @type param: list of strings - ''' - self.spine = [] + Create the <spine> element. Must first call :method:`create_manifest`. - for path in entries: - if not os.path.isabs(path): - path = os.path.join(self.base_path, path) - if not path.startswith(self.base_path): - raise ValueError('Invalid entry %s for base path %s'%(path, self.base_path)) - href = path[len(self.base_path)+1:] - in_manifest = False - for i, m in enumerate(self.manifest): - if m[0] == href: - in_manifest = True - break - if not in_manifest: - raise ValueError('%s is not in the manifest. (%s)'%(href, path)) - self.spine.append(i) - - + `entries`: List of paths + ''' + entries = map(lambda x: x if os.path.isabs(x) else + os.path.abspath(os.path.join(self.base_path, x)), entries) + self.spine = Spine.from_paths(entries, self.manifest) def set_toc(self, toc): ''' - Set the toc. You must call L{create_spine} before calling this + Set the toc. You must call :method:`create_spine` before calling this method. - @param toc: A Table of Contents - @type toc: L{TOC} + + `toc`: A :class:`TOC` object ''' self.toc = toc + def create_guide(self, guide_element): + self.guide = Guide.from_opf_guide(guide_element, self.base_path) + self.guide.set_basedir(self.base_path) + def render(self, opf_stream, ncx_stream=None): from calibre.resources import opf_template - from genshi.template import MarkupTemplate + from calibre.utils.genshi.template import MarkupTemplate template = MarkupTemplate(opf_template) + if self.manifest: + self.manifest.set_basedir(self.base_path) + if not self.guide: + self.guide = Guide() + self.guide.set_basedir(self.base_path) + if self.cover: + cover = self.cover + if not os.path.isabs(cover): + cover = os.path.abspath(os.path.join(self.base_path, cover)) + self.guide.set_cover(cover) opf = template.generate(__appname__=__appname__, mi=self).render('xml') opf_stream.write(opf) + opf_stream.flush() toc = getattr(self, 'toc', None) if toc is not None and ncx_stream is not None: toc.render(ncx_stream, self.application_id) + ncx_stream.flush() def option_parser(): return get_parser('opf') @@ -609,18 +518,35 @@ def main(args=sys.argv): if len(args) != 2: parser.print_help() return 1 - mi = MetaInformation(OPFReader(open(args[1], 'rb'))) + mi = MetaInformation(OPFReader(open(args[1], 'rb'), os.path.abspath(os.path.dirname(args[1])))) + write = False if opts.title is not None: mi.title = opts.title.replace('&', '&').replace('<', '<').replace('>', '>') + write = True if opts.authors is not None: aus = [i.strip().replace('&', '&').replace('<', '<').replace('>', '>') for i in opts.authors.split(',')] mi.authors = aus + write = True if opts.category is not None: mi.category = opts.category.replace('&', '&').replace('<', '<').replace('>', '>') + write = True if opts.comment is not None: mi.comments = opts.comment.replace('&', '&').replace('<', '<').replace('>', '>') - mo = OPFCreator(os.getcwd(), mi) - mo.render(open(args[1], 'wb')) + write = True + if write: + mo = OPFCreator(os.path.dirname(args[1]), mi) + ncx = cStringIO.StringIO() + mo.render(open(args[1], 'wb'), ncx) + ncx = ncx.getvalue() + if ncx: + f = glob.glob(os.path.join(os.path.dirname(args[1]), '*.ncx')) + if f: + f = open(f[0], 'wb') + else: + f = open(os.path.splitext(args[1])[0]+'.ncx', 'wb') + f.write(ncx) + f.close() + print MetaInformation(OPFReader(open(args[1], 'rb'), os.path.abspath(os.path.dirname(args[1])))) return 0 if __name__ == '__main__': diff --git a/src/calibre/ebooks/metadata/opf.xml b/src/calibre/ebooks/metadata/opf.xml index b74c67e085..10623715ff 100644 --- a/src/calibre/ebooks/metadata/opf.xml +++ b/src/calibre/ebooks/metadata/opf.xml @@ -23,24 +23,23 @@ </py:for> </metadata> - <guide> - <reference py:if="mi.cover" type="cover" href="${mi.cover}" /> - <reference py:if="mi.cover" type="other.ms-coverimage-standard" href="${mi.cover}" /> - <py:for each="ref in getattr(mi, 'extra_mobi_guide_elements', [])"> - <reference title="${ref[0]}" type="${ref[1]}" href="${ref[2]}" /> - </py:for> + <guide py:if="getattr(mi, 'guide', None)"> + <py:for each="ref in mi.guide"> + <reference type="${ref.type}" href="${ref.href()}" py:with="attrs={'title': ref.title if ref.title else None}" py:attrs="attrs" /> + </py:for> </guide> - <manifest py:if="getattr(mi, 'manifest', None)"> - <py:for each="i, m in enumerate(mi.manifest)"> - <item id="${str(i)}" href="${m[0]}" media-type="${m[1]}" /> - </py:for> - </manifest> - <spine py:if="getattr(mi, 'spine', None)" py:with="attrs={'toc':'ncx' if mi.toc else None}" py:attrs="attrs"> - <py:for each="idref in mi.spine"> - <itemref idref="${str(idref)}" /> + <py:for each="resource in mi.spine"> + <itemref idref="${resource.id}" /> </py:for> - </spine> + </spine> + + <manifest py:if="getattr(mi, 'manifest', None)"> + <py:for each="ref in mi.manifest"> + <item id="${ref.id}" href="${ref.href()}" media-type="${ref.mime_type}" /> + </py:for> + </manifest> + </package> diff --git a/src/calibre/ebooks/metadata/toc.py b/src/calibre/ebooks/metadata/toc.py index e63b5363ae..a966dd6fae 100644 --- a/src/calibre/ebooks/metadata/toc.py +++ b/src/calibre/ebooks/metadata/toc.py @@ -65,8 +65,8 @@ class TOC(list): toc = opfreader.soup.find('guide').find('reference', attrs={'type':'toc'})['href'] except: for item in opfreader.manifest: - if 'toc' in item.href.lower(): - toc = item.href + if 'toc' in item.href().lower(): + toc = item.href() break if toc is not None: @@ -120,6 +120,9 @@ class TOC(list): process_navpoint(c, nd) nm = soup.find('navmap') + if nm is None: + raise ValueError('NCX files must have a <navmap> element.') + for elem in nm: if getattr(elem, 'name', None) == 'navpoint': process_navpoint(elem, self) @@ -138,7 +141,7 @@ class TOC(list): def render(self, stream, uid): from calibre.resources import ncx_template - from genshi.template import MarkupTemplate + from calibre.utils.genshi.template import MarkupTemplate doctype = ('ncx', "-//NISO//DTD ncx 2005-1//EN", "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd") template = MarkupTemplate(ncx_template) raw = template.generate(uid=uid, toc=self, __appname__=__appname__) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 87e312ec23..f606a1e183 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -190,19 +190,11 @@ class MobiReader(object): open(os.path.splitext(htmlfile)[0]+'.ncx', 'wb').write(ncx) def cleanup(self): - self.processed_html = re.sub(r'<div height="0(em|%){0,1}"></div>', '', self.processed_html) + self.processed_html = re.sub(r'<div height="0(pt|px|ex|em|%){0,1}"></div>', '', self.processed_html) def create_opf(self, htmlfile, guide=None): mi = self.book_header.exth.mi opf = OPFCreator(os.path.dirname(htmlfile), mi) - guide_elements, toc = [], None - if guide: - for elem in guide.findAll('reference'): - if elem['type'] == 'toc': - toc = elem['href'] - continue - guide_elements.append((elem['title'], elem['type'], elem['href'])) - opf.extra_mobi_guide_elements = guide_elements if hasattr(self.book_header.exth, 'cover_offset'): opf.cover = 'images/%05d.jpg'%(self.book_header.exth.cover_offset+1) manifest = [(htmlfile, 'text/x-oeb1-document')] @@ -212,7 +204,12 @@ class MobiReader(object): opf.create_manifest(manifest) opf.create_spine([os.path.basename(htmlfile)]) - + toc = None + if guide: + opf.create_guide(guide) + for ref in opf.guide: + if ref.type.lower() == 'toc': + toc = ref.href() if toc: index = self.processed_html.find('<a name="%s"'%toc.partition('#')[-1]) tocobj = None diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 636f0a888f..8c31a4fb65 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -10,7 +10,8 @@ from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ from PyQt4.QtSvg import QSvgRenderer from calibre import __version__, __appname__, islinux, sanitize_file_name, \ - Settings, pictureflowerror, iswindows, isosx + Settings, pictureflowerror, iswindows, isosx,\ + preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat from calibre.devices.errors import FreeSpaceError @@ -1101,6 +1102,8 @@ class Main(MainWindow, Ui_MainWindow): msg = u'<p><b>%s</b>: %s'%exception msg += u'<p>Failed to perform <b>job</b>: '+description msg += u'<p>Detailed <b>traceback</b>:<pre>' + if not isinstance(formatted_traceback, unicode): + formatted_traceback = formatted_traceback.decode(preferred_encoding, 'replace') msg += formatted_traceback + '</pre>' msg += '<p><b>Log:</b></p><pre>' if log: diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index b0ddc0a72d..c84ce915fe 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -40,8 +40,6 @@ class MainWindow(QMainWindow): self.__console_redirect = DebugWindow(self) sys.stdout = sys.stderr = self.__console_redirect self.__console_redirect.show() - print 'testing 1' - print 'testing 2' def unhandled_exception(self, type, value, tb): try: diff --git a/src/calibre/linux.py b/src/calibre/linux.py index fc35a54b78..a7999050bb 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -354,7 +354,7 @@ def install_man_pages(fatal_errors): prog = src[:src.index('=')].strip() if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', 'markdown-calibre', 'calibre-debug', 'fb2-meta', - 'calibre-fontconfig'): + 'calibre-fontconfig', 'calibre-parallel'): continue help2man = ('help2man', prog, '--name', 'part of %s'%__appname__, '--section', '1', '--no-info', '--include', diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index fe66dad363..d22efcf0f0 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -37,7 +37,6 @@ class Distribution(object): ('dbus-python', '0.82.2', 'dbus-python', 'python-dbus', 'dbus-python'), ('convertlit', '1.8', 'convertlit', None, None), ('lxml', '1.3.3', 'lxml', 'python-lxml', 'python-lxml'), - ('genshi', '0.4.4', 'genshi', 'python-genshi', 'python-genshi'), ('help2man', '1.36.4', 'help2man', 'help2man', 'help2man'), ] @@ -231,7 +230,7 @@ If not, head over to <a href="http://calibre.kovidgoyal.net/wiki/Development#Tra def linux(self, req): operating_systems = [ - OS({'name' : 'binary', 'title': 'All distros'}), + OS({'name' : 'binary', 'title': 'Distro neutral'}), OS({'name' : 'gentoo', 'title': 'Gentoo'}), OS({'name' : 'ubuntu', 'title': 'Ubuntu'}), OS({'name' : 'fedora', 'title': 'Fedora'}), diff --git a/src/calibre/utils/genshi/__init__.py b/src/calibre/utils/genshi/__init__.py new file mode 100644 index 0000000000..51843d2b69 --- /dev/null +++ b/src/calibre/utils/genshi/__init__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""This package provides various means for generating and processing web markup +(XML or HTML). + +The design is centered around the concept of streams of markup events (similar +in concept to SAX parsing events) which can be processed in a uniform manner +independently of where or how they are produced. +""" + +__docformat__ = 'restructuredtext en' +try: + __version__ = __import__('pkg_resources').get_distribution('Genshi').version +except: + pass + +from calibre.utils.genshi.core import * +from calibre.utils.genshi.input import ParseError, XML, HTML diff --git a/src/calibre/utils/genshi/builder.py b/src/calibre/utils/genshi/builder.py new file mode 100644 index 0000000000..fac6185f0a --- /dev/null +++ b/src/calibre/utils/genshi/builder.py @@ -0,0 +1,362 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Support for programmatically generating markup streams from Python code using +a very simple syntax. The main entry point to this module is the `tag` object +(which is actually an instance of the ``ElementFactory`` class). You should +rarely (if ever) need to directly import and use any of the other classes in +this module. + +Elements can be created using the `tag` object using attribute access. For +example: + +>>> doc = tag.p('Some text and ', tag.a('a link', href='http://example.org/'), '.') +>>> doc +<Element "p"> + +This produces an `Element` instance which can be further modified to add child +nodes and attributes. This is done by "calling" the element: positional +arguments are added as child nodes (alternatively, the `Element.append` method +can be used for that purpose), whereas keywords arguments are added as +attributes: + +>>> doc(tag.br) +<Element "p"> +>>> print doc +<p>Some text and <a href="http://example.org/">a link</a>.<br/></p> + +If an attribute name collides with a Python keyword, simply append an underscore +to the name: + +>>> doc(class_='intro') +<Element "p"> +>>> print doc +<p class="intro">Some text and <a href="http://example.org/">a link</a>.<br/></p> + +As shown above, an `Element` can easily be directly rendered to XML text by +printing it or using the Python ``str()`` function. This is basically a +shortcut for converting the `Element` to a stream and serializing that +stream: + +>>> stream = doc.generate() +>>> stream #doctest: +ELLIPSIS +<genshi.core.Stream object at ...> +>>> print stream +<p class="intro">Some text and <a href="http://example.org/">a link</a>.<br/></p> + + +The `tag` object also allows creating "fragments", which are basically lists +of nodes (elements or text) that don't have a parent element. This can be useful +for creating snippets of markup that are attached to a parent element later (for +example in a template). Fragments are created by calling the `tag` object, which +returns an object of type `Fragment`: + +>>> fragment = tag('Hello, ', tag.em('world'), '!') +>>> fragment +<Fragment> +>>> print fragment +Hello, <em>world</em>! +""" + +try: + set +except NameError: + from sets import Set as set + +from calibre.utils.genshi.core import Attrs, Markup, Namespace, QName, Stream, \ + START, END, TEXT + +__all__ = ['Fragment', 'Element', 'ElementFactory', 'tag'] +__docformat__ = 'restructuredtext en' + + +class Fragment(object): + """Represents a markup fragment, which is basically just a list of element + or text nodes. + """ + __slots__ = ['children'] + + def __init__(self): + """Create a new fragment.""" + self.children = [] + + def __add__(self, other): + return Fragment()(self, other) + + def __call__(self, *args): + """Append any positional arguments as child nodes. + + :see: `append` + """ + map(self.append, args) + return self + + def __iter__(self): + return self._generate() + + def __repr__(self): + return '<%s>' % self.__class__.__name__ + + def __str__(self): + return str(self.generate()) + + def __unicode__(self): + return unicode(self.generate()) + + def __html__(self): + return Markup(self.generate()) + + def append(self, node): + """Append an element or string as child node. + + :param node: the node to append; can be an `Element`, `Fragment`, or a + `Stream`, or a Python string or number + """ + if isinstance(node, (Stream, Element, basestring, int, float, long)): + # For objects of a known/primitive type, we avoid the check for + # whether it is iterable for better performance + self.children.append(node) + elif isinstance(node, Fragment): + self.children.extend(node.children) + elif node is not None: + try: + map(self.append, iter(node)) + except TypeError: + self.children.append(node) + + def _generate(self): + for child in self.children: + if isinstance(child, Fragment): + for event in child._generate(): + yield event + elif isinstance(child, Stream): + for event in child: + yield event + else: + if not isinstance(child, basestring): + child = unicode(child) + yield TEXT, child, (None, -1, -1) + + def generate(self): + """Return a markup event stream for the fragment. + + :rtype: `Stream` + """ + return Stream(self._generate()) + + +def _kwargs_to_attrs(kwargs): + attrs = [] + names = set() + for name, value in kwargs.items(): + name = name.rstrip('_').replace('_', '-') + if value is not None and name not in names: + attrs.append((QName(name), unicode(value))) + names.add(name) + return Attrs(attrs) + + +class Element(Fragment): + """Simple XML output generator based on the builder pattern. + + Construct XML elements by passing the tag name to the constructor: + + >>> print Element('strong') + <strong/> + + Attributes can be specified using keyword arguments. The values of the + arguments will be converted to strings and any special XML characters + escaped: + + >>> print Element('textarea', rows=10, cols=60) + <textarea rows="10" cols="60"/> + >>> print Element('span', title='1 < 2') + <span title="1 < 2"/> + >>> print Element('span', title='"baz"') + <span title=""baz""/> + + The " character is escaped using a numerical entity. + The order in which attributes are rendered is undefined. + + If an attribute value evaluates to `None`, that attribute is not included + in the output: + + >>> print Element('a', name=None) + <a/> + + Attribute names that conflict with Python keywords can be specified by + appending an underscore: + + >>> print Element('div', class_='warning') + <div class="warning"/> + + Nested elements can be added to an element using item access notation. + The call notation can also be used for this and for adding attributes + using keyword arguments, as one would do in the constructor. + + >>> print Element('ul')(Element('li'), Element('li')) + <ul><li/><li/></ul> + >>> print Element('a')('Label') + <a>Label</a> + >>> print Element('a')('Label', href="target") + <a href="target">Label</a> + + Text nodes can be nested in an element by adding strings instead of + elements. Any special characters in the strings are escaped automatically: + + >>> print Element('em')('Hello world') + <em>Hello world</em> + >>> print Element('em')(42) + <em>42</em> + >>> print Element('em')('1 < 2') + <em>1 < 2</em> + + This technique also allows mixed content: + + >>> print Element('p')('Hello ', Element('b')('world')) + <p>Hello <b>world</b></p> + + Quotes are not escaped inside text nodes: + >>> print Element('p')('"Hello"') + <p>"Hello"</p> + + Elements can also be combined with other elements or strings using the + addition operator, which results in a `Fragment` object that contains the + operands: + + >>> print Element('br') + 'some text' + Element('br') + <br/>some text<br/> + + Elements with a namespace can be generated using the `Namespace` and/or + `QName` classes: + + >>> from genshi.core import Namespace + >>> xhtml = Namespace('http://www.w3.org/1999/xhtml') + >>> print Element(xhtml.html, lang='en') + <html xmlns="http://www.w3.org/1999/xhtml" lang="en"/> + """ + __slots__ = ['tag', 'attrib'] + + def __init__(self, tag_, **attrib): + Fragment.__init__(self) + self.tag = QName(tag_) + self.attrib = _kwargs_to_attrs(attrib) + + def __call__(self, *args, **kwargs): + """Append any positional arguments as child nodes, and keyword arguments + as attributes. + + :return: the element itself so that calls can be chained + :rtype: `Element` + :see: `Fragment.append` + """ + self.attrib |= _kwargs_to_attrs(kwargs) + Fragment.__call__(self, *args) + return self + + def __repr__(self): + return '<%s "%s">' % (self.__class__.__name__, self.tag) + + def _generate(self): + yield START, (self.tag, self.attrib), (None, -1, -1) + for kind, data, pos in Fragment._generate(self): + yield kind, data, pos + yield END, self.tag, (None, -1, -1) + + def generate(self): + """Return a markup event stream for the fragment. + + :rtype: `Stream` + """ + return Stream(self._generate()) + + +class ElementFactory(object): + """Factory for `Element` objects. + + A new element is created simply by accessing a correspondingly named + attribute of the factory object: + + >>> factory = ElementFactory() + >>> print factory.foo + <foo/> + >>> print factory.foo(id=2) + <foo id="2"/> + + Markup fragments (lists of nodes without a parent element) can be created + by calling the factory: + + >>> print factory('Hello, ', factory.em('world'), '!') + Hello, <em>world</em>! + + A factory can also be bound to a specific namespace: + + >>> factory = ElementFactory('http://www.w3.org/1999/xhtml') + >>> print factory.html(lang="en") + <html xmlns="http://www.w3.org/1999/xhtml" lang="en"/> + + The namespace for a specific element can be altered on an existing factory + by specifying the new namespace using item access: + + >>> factory = ElementFactory() + >>> print factory.html(factory['http://www.w3.org/2000/svg'].g(id=3)) + <html><g xmlns="http://www.w3.org/2000/svg" id="3"/></html> + + Usually, the `ElementFactory` class is not be used directly. Rather, the + `tag` instance should be used to create elements. + """ + + def __init__(self, namespace=None): + """Create the factory, optionally bound to the given namespace. + + :param namespace: the namespace URI for any created elements, or `None` + for no namespace + """ + if namespace and not isinstance(namespace, Namespace): + namespace = Namespace(namespace) + self.namespace = namespace + + def __call__(self, *args): + """Create a fragment that has the given positional arguments as child + nodes. + + :return: the created `Fragment` + :rtype: `Fragment` + """ + return Fragment()(*args) + + def __getitem__(self, namespace): + """Return a new factory that is bound to the specified namespace. + + :param namespace: the namespace URI or `Namespace` object + :return: an `ElementFactory` that produces elements bound to the given + namespace + :rtype: `ElementFactory` + """ + return ElementFactory(namespace) + + def __getattr__(self, name): + """Create an `Element` with the given name. + + :param name: the tag name of the element to create + :return: an `Element` with the specified name + :rtype: `Element` + """ + return Element(self.namespace and self.namespace[name] or name) + + +tag = ElementFactory() +"""Global `ElementFactory` bound to the default namespace. + +:type: `ElementFactory` +""" diff --git a/src/calibre/utils/genshi/core.py b/src/calibre/utils/genshi/core.py new file mode 100644 index 0000000000..aaa10edc82 --- /dev/null +++ b/src/calibre/utils/genshi/core.py @@ -0,0 +1,705 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Core classes for markup processing.""" + +from itertools import chain +import operator + +from calibre.utils.genshi.util import plaintext, stripentities, striptags + +__all__ = ['Stream', 'Markup', 'escape', 'unescape', 'Attrs', 'Namespace', + 'QName'] +__docformat__ = 'restructuredtext en' + + +class StreamEventKind(str): + """A kind of event on a markup stream.""" + __slots__ = [] + _instances = {} + + def __new__(cls, val): + return cls._instances.setdefault(val, str.__new__(cls, val)) + + +class Stream(object): + """Represents a stream of markup events. + + This class is basically an iterator over the events. + + Stream events are tuples of the form:: + + (kind, data, position) + + where ``kind`` is the event kind (such as `START`, `END`, `TEXT`, etc), + ``data`` depends on the kind of event, and ``position`` is a + ``(filename, line, offset)`` tuple that contains the location of the + original element or text in the input. If the original location is unknown, + ``position`` is ``(None, -1, -1)``. + + Also provided are ways to serialize the stream to text. The `serialize()` + method will return an iterator over generated strings, while `render()` + returns the complete generated text at once. Both accept various parameters + that impact the way the stream is serialized. + """ + __slots__ = ['events', 'serializer'] + + START = StreamEventKind('START') #: a start tag + END = StreamEventKind('END') #: an end tag + TEXT = StreamEventKind('TEXT') #: literal text + XML_DECL = StreamEventKind('XML_DECL') #: XML declaration + DOCTYPE = StreamEventKind('DOCTYPE') #: doctype declaration + START_NS = StreamEventKind('START_NS') #: start namespace mapping + END_NS = StreamEventKind('END_NS') #: end namespace mapping + START_CDATA = StreamEventKind('START_CDATA') #: start CDATA section + END_CDATA = StreamEventKind('END_CDATA') #: end CDATA section + PI = StreamEventKind('PI') #: processing instruction + COMMENT = StreamEventKind('COMMENT') #: comment + + def __init__(self, events, serializer=None): + """Initialize the stream with a sequence of markup events. + + :param events: a sequence or iterable providing the events + :param serializer: the default serialization method to use for this + stream + + :note: Changed in 0.5: added the `serializer` argument + """ + self.events = events #: The underlying iterable producing the events + self.serializer = serializer #: The default serializion method + + def __iter__(self): + return iter(self.events) + + def __or__(self, function): + """Override the "bitwise or" operator to apply filters or serializers + to the stream, providing a syntax similar to pipes on Unix shells. + + Assume the following stream produced by the `HTML` function: + + >>> from genshi.input import HTML + >>> html = HTML('''<p onclick="alert('Whoa')">Hello, world!</p>''') + >>> print html + <p onclick="alert('Whoa')">Hello, world!</p> + + A filter such as the HTML sanitizer can be applied to that stream using + the pipe notation as follows: + + >>> from genshi.filters import HTMLSanitizer + >>> sanitizer = HTMLSanitizer() + >>> print html | sanitizer + <p>Hello, world!</p> + + Filters can be any function that accepts and produces a stream (where + a stream is anything that iterates over events): + + >>> def uppercase(stream): + ... for kind, data, pos in stream: + ... if kind is TEXT: + ... data = data.upper() + ... yield kind, data, pos + >>> print html | sanitizer | uppercase + <p>HELLO, WORLD!</p> + + Serializers can also be used with this notation: + + >>> from genshi.output import TextSerializer + >>> output = TextSerializer() + >>> print html | sanitizer | uppercase | output + HELLO, WORLD! + + Commonly, serializers should be used at the end of the "pipeline"; + using them somewhere in the middle may produce unexpected results. + + :param function: the callable object that should be applied as a filter + :return: the filtered stream + :rtype: `Stream` + """ + return Stream(_ensure(function(self)), serializer=self.serializer) + + def filter(self, *filters): + """Apply filters to the stream. + + This method returns a new stream with the given filters applied. The + filters must be callables that accept the stream object as parameter, + and return the filtered stream. + + The call:: + + stream.filter(filter1, filter2) + + is equivalent to:: + + stream | filter1 | filter2 + + :param filters: one or more callable objects that should be applied as + filters + :return: the filtered stream + :rtype: `Stream` + """ + return reduce(operator.or_, (self,) + filters) + + def render(self, method=None, encoding='utf-8', out=None, **kwargs): + """Return a string representation of the stream. + + Any additional keyword arguments are passed to the serializer, and thus + depend on the `method` parameter value. + + :param method: determines how the stream is serialized; can be either + "xml", "xhtml", "html", "text", or a custom serializer + class; if `None`, the default serialization method of + the stream is used + :param encoding: how the output string should be encoded; if set to + `None`, this method returns a `unicode` object + :param out: a file-like object that the output should be written to + instead of being returned as one big string; note that if + this is a file or socket (or similar), the `encoding` must + not be `None` (that is, the output must be encoded) + :return: a `str` or `unicode` object (depending on the `encoding` + parameter), or `None` if the `out` parameter is provided + :rtype: `basestring` + + :see: XMLSerializer, XHTMLSerializer, HTMLSerializer, TextSerializer + :note: Changed in 0.5: added the `out` parameter + """ + from calibre.utils.genshi.output import encode + if method is None: + method = self.serializer or 'xml' + generator = self.serialize(method=method, **kwargs) + return encode(generator, method=method, encoding=encoding, out=out) + + def select(self, path, namespaces=None, variables=None): + """Return a new stream that contains the events matching the given + XPath expression. + + >>> from genshi import HTML + >>> stream = HTML('<doc><elem>foo</elem><elem>bar</elem></doc>') + >>> print stream.select('elem') + <elem>foo</elem><elem>bar</elem> + >>> print stream.select('elem/text()') + foobar + + Note that the outermost element of the stream becomes the *context + node* for the XPath test. That means that the expression "doc" would + not match anything in the example above, because it only tests against + child elements of the outermost element: + + >>> print stream.select('doc') + <BLANKLINE> + + You can use the "." expression to match the context node itself + (although that usually makes little sense): + + >>> print stream.select('.') + <doc><elem>foo</elem><elem>bar</elem></doc> + + :param path: a string containing the XPath expression + :param namespaces: mapping of namespace prefixes used in the path + :param variables: mapping of variable names to values + :return: the selected substream + :rtype: `Stream` + :raises PathSyntaxError: if the given path expression is invalid or not + supported + """ + from genshi.path import Path + return Path(path).select(self, namespaces, variables) + + def serialize(self, method='xml', **kwargs): + """Generate strings corresponding to a specific serialization of the + stream. + + Unlike the `render()` method, this method is a generator that returns + the serialized output incrementally, as opposed to returning a single + string. + + Any additional keyword arguments are passed to the serializer, and thus + depend on the `method` parameter value. + + :param method: determines how the stream is serialized; can be either + "xml", "xhtml", "html", "text", or a custom serializer + class; if `None`, the default serialization method of + the stream is used + :return: an iterator over the serialization results (`Markup` or + `unicode` objects, depending on the serialization method) + :rtype: ``iterator`` + :see: XMLSerializer, XHTMLSerializer, HTMLSerializer, TextSerializer + """ + from calibre.utils.genshi.output import get_serializer + if method is None: + method = self.serializer or 'xml' + return get_serializer(method, **kwargs)(_ensure(self)) + + def __str__(self): + return self.render() + + def __unicode__(self): + return self.render(encoding=None) + + def __html__(self): + return self + + +START = Stream.START +END = Stream.END +TEXT = Stream.TEXT +XML_DECL = Stream.XML_DECL +DOCTYPE = Stream.DOCTYPE +START_NS = Stream.START_NS +END_NS = Stream.END_NS +START_CDATA = Stream.START_CDATA +END_CDATA = Stream.END_CDATA +PI = Stream.PI +COMMENT = Stream.COMMENT + +def _ensure(stream): + """Ensure that every item on the stream is actually a markup event.""" + stream = iter(stream) + event = stream.next() + + # Check whether the iterable is a real markup event stream by examining the + # first item it yields; if it's not we'll need to do some conversion + if type(event) is not tuple or len(event) != 3: + for event in chain([event], stream): + if hasattr(event, 'totuple'): + event = event.totuple() + else: + event = TEXT, unicode(event), (None, -1, -1) + yield event + return + + # This looks like a markup event stream, so we'll just pass it through + # unchanged + yield event + for event in stream: + yield event + + +class Attrs(tuple): + """Immutable sequence type that stores the attributes of an element. + + Ordering of the attributes is preserved, while access by name is also + supported. + + >>> attrs = Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs + Attrs([('href', '#'), ('title', 'Foo')]) + + >>> 'href' in attrs + True + >>> 'tabindex' in attrs + False + >>> attrs.get('title') + 'Foo' + + Instances may not be manipulated directly. Instead, the operators ``|`` and + ``-`` can be used to produce new instances that have specific attributes + added, replaced or removed. + + To remove an attribute, use the ``-`` operator. The right hand side can be + either a string or a set/sequence of strings, identifying the name(s) of + the attribute(s) to remove: + + >>> attrs - 'title' + Attrs([('href', '#')]) + >>> attrs - ('title', 'href') + Attrs() + + The original instance is not modified, but the operator can of course be + used with an assignment: + + >>> attrs + Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs -= 'title' + >>> attrs + Attrs([('href', '#')]) + + To add a new attribute, use the ``|`` operator, where the right hand value + is a sequence of ``(name, value)`` tuples (which includes `Attrs` + instances): + + >>> attrs | [('title', 'Bar')] + Attrs([('href', '#'), ('title', 'Bar')]) + + If the attributes already contain an attribute with a given name, the value + of that attribute is replaced: + + >>> attrs | [('href', 'http://example.org/')] + Attrs([('href', 'http://example.org/')]) + """ + __slots__ = [] + + def __contains__(self, name): + """Return whether the list includes an attribute with the specified + name. + + :return: `True` if the list includes the attribute + :rtype: `bool` + """ + for attr, _ in self: + if attr == name: + return True + + def __getslice__(self, i, j): + """Return a slice of the attributes list. + + >>> attrs = Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs[1:] + Attrs([('title', 'Foo')]) + """ + return Attrs(tuple.__getslice__(self, i, j)) + + def __or__(self, attrs): + """Return a new instance that contains the attributes in `attrs` in + addition to any already existing attributes. + + :return: a new instance with the merged attributes + :rtype: `Attrs` + """ + repl = dict([(an, av) for an, av in attrs if an in self]) + return Attrs([(sn, repl.get(sn, sv)) for sn, sv in self] + + [(an, av) for an, av in attrs if an not in self]) + + def __repr__(self): + if not self: + return 'Attrs()' + return 'Attrs([%s])' % ', '.join([repr(item) for item in self]) + + def __sub__(self, names): + """Return a new instance with all attributes with a name in `names` are + removed. + + :param names: the names of the attributes to remove + :return: a new instance with the attribute removed + :rtype: `Attrs` + """ + if isinstance(names, basestring): + names = (names,) + return Attrs([(name, val) for name, val in self if name not in names]) + + def get(self, name, default=None): + """Return the value of the attribute with the specified name, or the + value of the `default` parameter if no such attribute is found. + + :param name: the name of the attribute + :param default: the value to return when the attribute does not exist + :return: the attribute value, or the `default` value if that attribute + does not exist + :rtype: `object` + """ + for attr, value in self: + if attr == name: + return value + return default + + def totuple(self): + """Return the attributes as a markup event. + + The returned event is a `TEXT` event, the data is the value of all + attributes joined together. + + >>> Attrs([('href', '#'), ('title', 'Foo')]).totuple() + ('TEXT', u'#Foo', (None, -1, -1)) + + :return: a `TEXT` event + :rtype: `tuple` + """ + return TEXT, u''.join([x[1] for x in self]), (None, -1, -1) + + +class Markup(unicode): + """Marks a string as being safe for inclusion in HTML/XML output without + needing to be escaped. + """ + __slots__ = [] + + def __add__(self, other): + return Markup(unicode(self) + unicode(escape(other))) + + def __radd__(self, other): + return Markup(unicode(escape(other)) + unicode(self)) + + def __mod__(self, args): + if isinstance(args, dict): + args = dict(zip(args.keys(), map(escape, args.values()))) + elif isinstance(args, (list, tuple)): + args = tuple(map(escape, args)) + else: + args = escape(args) + return Markup(unicode.__mod__(self, args)) + + def __mul__(self, num): + return Markup(unicode(self) * num) + + def __rmul__(self, num): + return Markup(num * unicode(self)) + + def __repr__(self): + return '<%s %r>' % (self.__class__.__name__, unicode(self)) + + def join(self, seq, escape_quotes=True): + """Return a `Markup` object which is the concatenation of the strings + in the given sequence, where this `Markup` object is the separator + between the joined elements. + + Any element in the sequence that is not a `Markup` instance is + automatically escaped. + + :param seq: the sequence of strings to join + :param escape_quotes: whether double quote characters in the elements + should be escaped + :return: the joined `Markup` object + :rtype: `Markup` + :see: `escape` + """ + return Markup(unicode(self).join([escape(item, quotes=escape_quotes) + for item in seq])) + + def escape(cls, text, quotes=True): + """Create a Markup instance from a string and escape special characters + it may contain (<, >, & and \"). + + >>> escape('"1 < 2"') + <Markup u'"1 < 2"'> + + If the `quotes` parameter is set to `False`, the \" character is left + as is. Escaping quotes is generally only required for strings that are + to be used in attribute values. + + >>> escape('"1 < 2"', quotes=False) + <Markup u'"1 < 2"'> + + :param text: the text to escape + :param quotes: if ``True``, double quote characters are escaped in + addition to the other special characters + :return: the escaped `Markup` string + :rtype: `Markup` + """ + if not text: + return cls() + if type(text) is cls: + return text + if hasattr(text, '__html__'): + return Markup(text.__html__()) + + text = unicode(text).replace('&', '&') \ + .replace('<', '<') \ + .replace('>', '>') + if quotes: + text = text.replace('"', '"') + return cls(text) + escape = classmethod(escape) + + def unescape(self): + """Reverse-escapes &, <, >, and \" and returns a `unicode` object. + + >>> Markup('1 < 2').unescape() + u'1 < 2' + + :return: the unescaped string + :rtype: `unicode` + :see: `genshi.core.unescape` + """ + if not self: + return u'' + return unicode(self).replace('"', '"') \ + .replace('>', '>') \ + .replace('<', '<') \ + .replace('&', '&') + + def stripentities(self, keepxmlentities=False): + """Return a copy of the text with any character or numeric entities + replaced by the equivalent UTF-8 characters. + + If the `keepxmlentities` parameter is provided and evaluates to `True`, + the core XML entities (``&``, ``'``, ``>``, ``<`` and + ``"``) are not stripped. + + :return: a `Markup` instance with entities removed + :rtype: `Markup` + :see: `genshi.util.stripentities` + """ + return Markup(stripentities(self, keepxmlentities=keepxmlentities)) + + def striptags(self): + """Return a copy of the text with all XML/HTML tags removed. + + :return: a `Markup` instance with all tags removed + :rtype: `Markup` + :see: `genshi.util.striptags` + """ + return Markup(striptags(self)) + + +try: + from calibre.utils.genshi._speedups import Markup +except ImportError: + pass # just use the Python implementation + +escape = Markup.escape + +def unescape(text): + """Reverse-escapes &, <, >, and \" and returns a `unicode` object. + + >>> unescape(Markup('1 < 2')) + u'1 < 2' + + If the provided `text` object is not a `Markup` instance, it is returned + unchanged. + + >>> unescape('1 < 2') + '1 < 2' + + :param text: the text to unescape + :return: the unescsaped string + :rtype: `unicode` + """ + if not isinstance(text, Markup): + return text + return text.unescape() + + +class Namespace(object): + """Utility class creating and testing elements with a namespace. + + Internally, namespace URIs are encoded in the `QName` of any element or + attribute, the namespace URI being enclosed in curly braces. This class + helps create and test these strings. + + A `Namespace` object is instantiated with the namespace URI. + + >>> html = Namespace('http://www.w3.org/1999/xhtml') + >>> html + <Namespace "http://www.w3.org/1999/xhtml"> + >>> html.uri + u'http://www.w3.org/1999/xhtml' + + The `Namespace` object can than be used to generate `QName` objects with + that namespace: + + >>> html.body + QName(u'http://www.w3.org/1999/xhtml}body') + >>> html.body.localname + u'body' + >>> html.body.namespace + u'http://www.w3.org/1999/xhtml' + + The same works using item access notation, which is useful for element or + attribute names that are not valid Python identifiers: + + >>> html['body'] + QName(u'http://www.w3.org/1999/xhtml}body') + + A `Namespace` object can also be used to test whether a specific `QName` + belongs to that namespace using the ``in`` operator: + + >>> qname = html.body + >>> qname in html + True + >>> qname in Namespace('http://www.w3.org/2002/06/xhtml2') + False + """ + def __new__(cls, uri): + if type(uri) is cls: + return uri + return object.__new__(cls) + + def __getnewargs__(self): + return (self.uri,) + + def __getstate__(self): + return self.uri + + def __setstate__(self, uri): + self.uri = uri + + def __init__(self, uri): + self.uri = unicode(uri) + + def __contains__(self, qname): + return qname.namespace == self.uri + + def __ne__(self, other): + return not self == other + + def __eq__(self, other): + if isinstance(other, Namespace): + return self.uri == other.uri + return self.uri == other + + def __getitem__(self, name): + return QName(self.uri + u'}' + name) + __getattr__ = __getitem__ + + def __repr__(self): + return '<Namespace "%s">' % self.uri + + def __str__(self): + return self.uri.encode('utf-8') + + def __unicode__(self): + return self.uri + + +# The namespace used by attributes such as xml:lang and xml:space +XML_NAMESPACE = Namespace('http://www.w3.org/XML/1998/namespace') + + +class QName(unicode): + """A qualified element or attribute name. + + The unicode value of instances of this class contains the qualified name of + the element or attribute, in the form ``{namespace-uri}local-name``. The + namespace URI can be obtained through the additional `namespace` attribute, + while the local name can be accessed through the `localname` attribute. + + >>> qname = QName('foo') + >>> qname + QName(u'foo') + >>> qname.localname + u'foo' + >>> qname.namespace + + >>> qname = QName('http://www.w3.org/1999/xhtml}body') + >>> qname + QName(u'http://www.w3.org/1999/xhtml}body') + >>> qname.localname + u'body' + >>> qname.namespace + u'http://www.w3.org/1999/xhtml' + """ + __slots__ = ['namespace', 'localname'] + + def __new__(cls, qname): + """Create the `QName` instance. + + :param qname: the qualified name as a string of the form + ``{namespace-uri}local-name``, where the leading curly + brace is optional + """ + if type(qname) is cls: + return qname + + parts = qname.lstrip(u'{').split(u'}', 1) + if len(parts) > 1: + self = unicode.__new__(cls, u'{%s' % qname) + self.namespace, self.localname = map(unicode, parts) + else: + self = unicode.__new__(cls, qname) + self.namespace, self.localname = None, unicode(qname) + return self + + def __getnewargs__(self): + return (self.lstrip('{'),) + + def __repr__(self): + return 'QName(%s)' % unicode.__repr__(self.lstrip('{')) diff --git a/src/calibre/utils/genshi/filters/__init__.py b/src/calibre/utils/genshi/filters/__init__.py new file mode 100644 index 0000000000..828a348bdb --- /dev/null +++ b/src/calibre/utils/genshi/filters/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Implementation of a number of stream filters.""" + +from calibre.utils.genshi.filters.html import HTMLFormFiller, HTMLSanitizer +from calibre.utils.genshi.filters.i18n import Translator +from calibre.utils.genshi.filters.transform import Transformer + +__docformat__ = 'restructuredtext en' diff --git a/src/calibre/utils/genshi/filters/html.py b/src/calibre/utils/genshi/filters/html.py new file mode 100644 index 0000000000..59eafda919 --- /dev/null +++ b/src/calibre/utils/genshi/filters/html.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Implementation of a number of stream filters.""" + +try: + set +except NameError: + from sets import ImmutableSet as frozenset + from sets import Set as set +import re + +from calibre.utils.genshi.core import Attrs, QName, stripentities +from calibre.utils.genshi.core import END, START, TEXT, COMMENT + +__all__ = ['HTMLFormFiller', 'HTMLSanitizer'] +__docformat__ = 'restructuredtext en' + + +class HTMLFormFiller(object): + """A stream filter that can populate HTML forms from a dictionary of values. + + >>> from genshi.input import HTML + >>> html = HTML('''<form> + ... <p><input type="text" name="foo" /></p> + ... </form>''') + >>> filler = HTMLFormFiller(data={'foo': 'bar'}) + >>> print html | filler + <form> + <p><input type="text" name="foo" value="bar"/></p> + </form> + """ + # TODO: only select the first radio button, and the first select option + # (if not in a multiple-select) + # TODO: only apply to elements in the XHTML namespace (or no namespace)? + + def __init__(self, name=None, id=None, data=None): + """Create the filter. + + :param name: The name of the form that should be populated. If this + parameter is given, only forms where the ``name`` attribute + value matches the parameter are processed. + :param id: The ID of the form that should be populated. If this + parameter is given, only forms where the ``id`` attribute + value matches the parameter are processed. + :param data: The dictionary of form values, where the keys are the names + of the form fields, and the values are the values to fill + in. + """ + self.name = name + self.id = id + if data is None: + data = {} + self.data = data + + def __call__(self, stream): + """Apply the filter to the given stream. + + :param stream: the markup event stream to filter + """ + in_form = in_select = in_option = in_textarea = False + select_value = option_value = textarea_value = None + option_start = None + option_text = [] + no_option_value = False + + for kind, data, pos in stream: + + if kind is START: + tag, attrs = data + tagname = tag.localname + + if tagname == 'form' and ( + self.name and attrs.get('name') == self.name or + self.id and attrs.get('id') == self.id or + not (self.id or self.name)): + in_form = True + + elif in_form: + if tagname == 'input': + type = attrs.get('type') + if type in ('checkbox', 'radio'): + name = attrs.get('name') + if name and name in self.data: + value = self.data[name] + declval = attrs.get('value') + checked = False + if isinstance(value, (list, tuple)): + if declval: + checked = declval in [unicode(v) for v + in value] + else: + checked = bool(filter(None, value)) + else: + if declval: + checked = declval == unicode(value) + elif type == 'checkbox': + checked = bool(value) + if checked: + attrs |= [(QName('checked'), 'checked')] + elif 'checked' in attrs: + attrs -= 'checked' + elif type in (None, 'hidden', 'text'): + name = attrs.get('name') + if name and name in self.data: + value = self.data[name] + if isinstance(value, (list, tuple)): + value = value[0] + if value is not None: + attrs |= [(QName('value'), unicode(value))] + elif tagname == 'select': + name = attrs.get('name') + if name in self.data: + select_value = self.data[name] + in_select = True + elif tagname == 'textarea': + name = attrs.get('name') + if name in self.data: + textarea_value = self.data.get(name) + if isinstance(textarea_value, (list, tuple)): + textarea_value = textarea_value[0] + in_textarea = True + elif in_select and tagname == 'option': + option_start = kind, data, pos + option_value = attrs.get('value') + if option_value is None: + no_option_value = True + option_value = '' + in_option = True + continue + yield kind, (tag, attrs), pos + + elif in_form and kind is TEXT: + if in_select and in_option: + if no_option_value: + option_value += data + option_text.append((kind, data, pos)) + continue + elif in_textarea: + continue + yield kind, data, pos + + elif in_form and kind is END: + tagname = data.localname + if tagname == 'form': + in_form = False + elif tagname == 'select': + in_select = False + select_value = None + elif in_select and tagname == 'option': + if isinstance(select_value, (tuple, list)): + selected = option_value in [unicode(v) for v + in select_value] + else: + selected = option_value == unicode(select_value) + okind, (tag, attrs), opos = option_start + if selected: + attrs |= [(QName('selected'), 'selected')] + elif 'selected' in attrs: + attrs -= 'selected' + yield okind, (tag, attrs), opos + if option_text: + for event in option_text: + yield event + in_option = False + no_option_value = False + option_start = option_value = None + option_text = [] + elif tagname == 'textarea': + if textarea_value: + yield TEXT, unicode(textarea_value), pos + in_textarea = False + yield kind, data, pos + + else: + yield kind, data, pos + + +class HTMLSanitizer(object): + """A filter that removes potentially dangerous HTML tags and attributes + from the stream. + + >>> from genshi import HTML + >>> html = HTML('<div><script>alert(document.cookie)</script></div>') + >>> print html | HTMLSanitizer() + <div/> + + The default set of safe tags and attributes can be modified when the filter + is instantiated. For example, to allow inline ``style`` attributes, the + following instantation would work: + + >>> html = HTML('<div style="background: #000"></div>') + >>> sanitizer = HTMLSanitizer(safe_attrs=HTMLSanitizer.SAFE_ATTRS | set(['style'])) + >>> print html | sanitizer + <div style="background: #000"/> + + Note that even in this case, the filter *does* attempt to remove dangerous + constructs from style attributes: + + >>> html = HTML('<div style="background: url(javascript:void); color: #000"></div>') + >>> print html | sanitizer + <div style="color: #000"/> + + This handles HTML entities, unicode escapes in CSS and Javascript text, as + well as a lot of other things. However, the style tag is still excluded by + default because it is very hard for such sanitizing to be completely safe, + especially considering how much error recovery current web browsers perform. + + :warn: Note that this special processing of CSS is currently only applied to + style attributes, **not** style elements. + """ + + SAFE_TAGS = frozenset(['a', 'abbr', 'acronym', 'address', 'area', 'b', + 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite', + 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', + 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map', + 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp', + 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', + 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', + 'ul', 'var']) + + SAFE_ATTRS = frozenset(['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'axis', 'bgcolor', 'border', 'cellpadding', + 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', + 'clear', 'cols', 'colspan', 'color', 'compact', 'coords', 'datetime', + 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height', + 'href', 'hreflang', 'hspace', 'id', 'ismap', 'label', 'lang', + 'longdesc', 'maxlength', 'media', 'method', 'multiple', 'name', + 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', 'rel', 'rev', + 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', + 'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', + 'type', 'usemap', 'valign', 'value', 'vspace', 'width']) + + SAFE_SCHEMES = frozenset(['file', 'ftp', 'http', 'https', 'mailto', None]) + + URI_ATTRS = frozenset(['action', 'background', 'dynsrc', 'href', 'lowsrc', + 'src']) + + def __init__(self, safe_tags=SAFE_TAGS, safe_attrs=SAFE_ATTRS, + safe_schemes=SAFE_SCHEMES, uri_attrs=URI_ATTRS): + """Create the sanitizer. + + The exact set of allowed elements and attributes can be configured. + + :param safe_tags: a set of tag names that are considered safe + :param safe_attrs: a set of attribute names that are considered safe + :param safe_schemes: a set of URI schemes that are considered safe + :param uri_attrs: a set of names of attributes that contain URIs + """ + self.safe_tags = safe_tags + "The set of tag names that are considered safe." + self.safe_attrs = safe_attrs + "The set of attribute names that are considered safe." + self.uri_attrs = uri_attrs + "The set of names of attributes that may contain URIs." + self.safe_schemes = safe_schemes + "The set of URI schemes that are considered safe." + + def __call__(self, stream): + """Apply the filter to the given stream. + + :param stream: the markup event stream to filter + """ + waiting_for = None + + for kind, data, pos in stream: + if kind is START: + if waiting_for: + continue + tag, attrs = data + if tag not in self.safe_tags: + waiting_for = tag + continue + + new_attrs = [] + for attr, value in attrs: + value = stripentities(value) + if attr not in self.safe_attrs: + continue + elif attr in self.uri_attrs: + # Don't allow URI schemes such as "javascript:" + if not self.is_safe_uri(value): + continue + elif attr == 'style': + # Remove dangerous CSS declarations from inline styles + decls = self.sanitize_css(value) + if not decls: + continue + value = '; '.join(decls) + new_attrs.append((attr, value)) + + yield kind, (tag, Attrs(new_attrs)), pos + + elif kind is END: + tag = data + if waiting_for: + if waiting_for == tag: + waiting_for = None + else: + yield kind, data, pos + + elif kind is not COMMENT: + if not waiting_for: + yield kind, data, pos + + def is_safe_uri(self, uri): + """Determine whether the given URI is to be considered safe for + inclusion in the output. + + The default implementation checks whether the scheme of the URI is in + the set of allowed URIs (`safe_schemes`). + + >>> sanitizer = HTMLSanitizer() + >>> sanitizer.is_safe_uri('http://example.org/') + True + >>> sanitizer.is_safe_uri('javascript:alert(document.cookie)') + False + + :param uri: the URI to check + :return: `True` if the URI can be considered safe, `False` otherwise + :rtype: `bool` + :since: version 0.4.3 + """ + if ':' not in uri: + return True # This is a relative URI + chars = [char for char in uri.split(':', 1)[0] if char.isalnum()] + return ''.join(chars).lower() in self.safe_schemes + + def sanitize_css(self, text): + """Remove potentially dangerous property declarations from CSS code. + + In particular, properties using the CSS ``url()`` function with a scheme + that is not considered safe are removed: + + >>> sanitizer = HTMLSanitizer() + >>> sanitizer.sanitize_css(u''' + ... background: url(javascript:alert("foo")); + ... color: #000; + ... ''') + [u'color: #000'] + + Also, the proprietary Internet Explorer function ``expression()`` is + always stripped: + + >>> sanitizer.sanitize_css(u''' + ... background: #fff; + ... color: #000; + ... width: e/**/xpression(alert("foo")); + ... ''') + [u'background: #fff', u'color: #000'] + + :param text: the CSS text; this is expected to be `unicode` and to not + contain any character or numeric references + :return: a list of declarations that are considered safe + :rtype: `list` + :since: version 0.4.3 + """ + decls = [] + text = self._strip_css_comments(self._replace_unicode_escapes(text)) + for decl in filter(None, text.split(';')): + decl = decl.strip() + if not decl: + continue + is_evil = False + if 'expression' in decl: + is_evil = True + for match in re.finditer(r'url\s*\(([^)]+)', decl): + if not self.is_safe_uri(match.group(1)): + is_evil = True + break + if not is_evil: + decls.append(decl.strip()) + return decls + + _NORMALIZE_NEWLINES = re.compile(r'\r\n').sub + _UNICODE_ESCAPE = re.compile(r'\\([0-9a-fA-F]{1,6})\s?').sub + + def _replace_unicode_escapes(self, text): + def _repl(match): + return unichr(int(match.group(1), 16)) + return self._UNICODE_ESCAPE(_repl, self._NORMALIZE_NEWLINES('\n', text)) + + _CSS_COMMENTS = re.compile(r'/\*.*?\*/').sub + + def _strip_css_comments(self, text): + return self._CSS_COMMENTS('', text) diff --git a/src/calibre/utils/genshi/filters/i18n.py b/src/calibre/utils/genshi/filters/i18n.py new file mode 100644 index 0000000000..b0d919aa21 --- /dev/null +++ b/src/calibre/utils/genshi/filters/i18n.py @@ -0,0 +1,528 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Utilities for internationalization and localization of templates. + +:since: version 0.4 +""" + +from compiler import ast +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset +from gettext import gettext +import re + +from calibre.utils.genshi.core import Attrs, Namespace, QName, START, END, TEXT, START_NS, \ + END_NS, XML_NAMESPACE, _ensure +from calibre.utils.genshi.template.base import Template, EXPR, SUB +from calibre.utils.genshi.template.markup import MarkupTemplate, EXEC + +__all__ = ['Translator', 'extract'] +__docformat__ = 'restructuredtext en' + +I18N_NAMESPACE = Namespace('http://genshi.edgewall.org/i18n') + + +class Translator(object): + """Can extract and translate localizable strings from markup streams and + templates. + + For example, assume the followng template: + + >>> from genshi.template import MarkupTemplate + >>> + >>> tmpl = MarkupTemplate('''<html xmlns:py="http://genshi.edgewall.org/"> + ... <head> + ... <title>Example + ... + ... + ...

          Example

          + ...

          ${_("Hello, %(name)s") % dict(name=username)}

          + ... + ... ''', filename='example.html') + + For demonstration, we define a dummy ``gettext``-style function with a + hard-coded translation table, and pass that to the `Translator` initializer: + + >>> def pseudo_gettext(string): + ... return { + ... 'Example': 'Beispiel', + ... 'Hello, %(name)s': 'Hallo, %(name)s' + ... }[string] + >>> + >>> translator = Translator(pseudo_gettext) + + Next, the translator needs to be prepended to any already defined filters + on the template: + + >>> tmpl.filters.insert(0, translator) + + When generating the template output, our hard-coded translations should be + applied as expected: + + >>> print tmpl.generate(username='Hans', _=pseudo_gettext) + + + Beispiel + + +

          Beispiel

          +

          Hallo, Hans

          + + + + Note that elements defining ``xml:lang`` attributes that do not contain + variable expressions are ignored by this filter. That can be used to + exclude specific parts of a template from being extracted and translated. + """ + + IGNORE_TAGS = frozenset([ + QName('script'), QName('http://www.w3.org/1999/xhtml}script'), + QName('style'), QName('http://www.w3.org/1999/xhtml}style') + ]) + INCLUDE_ATTRS = frozenset(['abbr', 'alt', 'label', 'prompt', 'standby', + 'summary', 'title']) + + def __init__(self, translate=gettext, ignore_tags=IGNORE_TAGS, + include_attrs=INCLUDE_ATTRS, extract_text=True): + """Initialize the translator. + + :param translate: the translation function, for example ``gettext`` or + ``ugettext``. + :param ignore_tags: a set of tag names that should not be localized + :param include_attrs: a set of attribute names should be localized + :param extract_text: whether the content of text nodes should be + extracted, or only text in explicit ``gettext`` + function calls + """ + self.translate = translate + self.ignore_tags = ignore_tags + self.include_attrs = include_attrs + self.extract_text = extract_text + + def __call__(self, stream, ctxt=None, search_text=True, msgbuf=None): + """Translate any localizable strings in the given stream. + + This function shouldn't be called directly. Instead, an instance of + the `Translator` class should be registered as a filter with the + `Template` or the `TemplateLoader`, or applied as a regular stream + filter. If used as a template filter, it should be inserted in front of + all the default filters. + + :param stream: the markup event stream + :param ctxt: the template context (not used) + :param search_text: whether text nodes should be translated (used + internally) + :param msgbuf: a `MessageBuffer` object or `None` (used internally) + :return: the localized stream + """ + ignore_tags = self.ignore_tags + include_attrs = self.include_attrs + translate = self.translate + if not self.extract_text: + search_text = False + skip = 0 + i18n_msg = I18N_NAMESPACE['msg'] + ns_prefixes = [] + xml_lang = XML_NAMESPACE['lang'] + + for kind, data, pos in stream: + + # skip chunks that should not be localized + if skip: + if kind is START: + skip += 1 + elif kind is END: + skip -= 1 + yield kind, data, pos + continue + + # handle different events that can be localized + if kind is START: + tag, attrs = data + if tag in self.ignore_tags or \ + isinstance(attrs.get(xml_lang), basestring): + skip += 1 + yield kind, data, pos + continue + + new_attrs = [] + changed = False + for name, value in attrs: + newval = value + if search_text and isinstance(value, basestring): + if name in include_attrs: + newval = self.translate(value) + else: + newval = list(self(_ensure(value), ctxt, + search_text=False, msgbuf=msgbuf) + ) + if newval != value: + value = newval + changed = True + new_attrs.append((name, value)) + if changed: + attrs = Attrs(new_attrs) + + if msgbuf: + msgbuf.append(kind, data, pos) + continue + elif i18n_msg in attrs: + msgbuf = MessageBuffer() + attrs -= i18n_msg + + yield kind, (tag, attrs), pos + + elif search_text and kind is TEXT: + if not msgbuf: + text = data.strip() + if text: + data = data.replace(text, translate(text)) + yield kind, data, pos + else: + msgbuf.append(kind, data, pos) + + elif not skip and msgbuf and kind is END: + msgbuf.append(kind, data, pos) + if not msgbuf.depth: + for event in msgbuf.translate(translate(msgbuf.format())): + yield event + msgbuf = None + yield kind, data, pos + + elif kind is SUB: + subkind, substream = data + new_substream = list(self(substream, ctxt, msgbuf=msgbuf)) + yield kind, (subkind, new_substream), pos + + elif kind is START_NS and data[1] == I18N_NAMESPACE: + ns_prefixes.append(data[0]) + + elif kind is END_NS and data in ns_prefixes: + ns_prefixes.remove(data) + + else: + yield kind, data, pos + + GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext', 'dgettext', 'dngettext', + 'ugettext', 'ungettext') + + def extract(self, stream, gettext_functions=GETTEXT_FUNCTIONS, + search_text=True, msgbuf=None): + """Extract localizable strings from the given template stream. + + For every string found, this function yields a ``(lineno, function, + message)`` tuple, where: + + * ``lineno`` is the number of the line on which the string was found, + * ``function`` is the name of the ``gettext`` function used (if the + string was extracted from embedded Python code), and + * ``message`` is the string itself (a ``unicode`` object, or a tuple + of ``unicode`` objects for functions with multiple string arguments). + + >>> from genshi.template import MarkupTemplate + >>> + >>> tmpl = MarkupTemplate(''' + ... + ... Example + ... + ... + ...

          Example

          + ...

          ${_("Hello, %(name)s") % dict(name=username)}

          + ...

          ${ngettext("You have %d item", "You have %d items", num)}

          + ... + ... ''', filename='example.html') + >>> + >>> for lineno, funcname, message in Translator().extract(tmpl.stream): + ... print "%d, %r, %r" % (lineno, funcname, message) + 3, None, u'Example' + 6, None, u'Example' + 7, '_', u'Hello, %(name)s' + 8, 'ngettext', (u'You have %d item', u'You have %d items', None) + + :param stream: the event stream to extract strings from; can be a + regular stream or a template stream + :param gettext_functions: a sequence of function names that should be + treated as gettext-style localization + functions + :param search_text: whether the content of text nodes should be + extracted (used internally) + + :note: Changed in 0.4.1: For a function with multiple string arguments + (such as ``ngettext``), a single item with a tuple of strings is + yielded, instead an item for each string argument. + """ + if not self.extract_text: + search_text = False + skip = 0 + i18n_msg = I18N_NAMESPACE['msg'] + xml_lang = XML_NAMESPACE['lang'] + + for kind, data, pos in stream: + + if skip: + if kind is START: + skip += 1 + if kind is END: + skip -= 1 + + if kind is START and not skip: + tag, attrs = data + + if tag in self.ignore_tags or \ + isinstance(attrs.get(xml_lang), basestring): + skip += 1 + continue + + for name, value in attrs: + if search_text and isinstance(value, basestring): + if name in self.include_attrs: + text = value.strip() + if text: + yield pos[1], None, text + else: + for lineno, funcname, text in self.extract( + _ensure(value), gettext_functions, + search_text=False): + yield lineno, funcname, text + + if msgbuf: + msgbuf.append(kind, data, pos) + elif i18n_msg in attrs: + msgbuf = MessageBuffer(pos[1]) + + elif not skip and search_text and kind is TEXT: + if not msgbuf: + text = data.strip() + if text and filter(None, [ch.isalpha() for ch in text]): + yield pos[1], None, text + else: + msgbuf.append(kind, data, pos) + + elif not skip and msgbuf and kind is END: + msgbuf.append(kind, data, pos) + if not msgbuf.depth: + yield msgbuf.lineno, None, msgbuf.format() + msgbuf = None + + elif kind is EXPR or kind is EXEC: + for funcname, strings in extract_from_code(data, + gettext_functions): + yield pos[1], funcname, strings + + elif kind is SUB: + subkind, substream = data + messages = self.extract(substream, gettext_functions, + search_text=search_text and not skip, + msgbuf=msgbuf) + for lineno, funcname, text in messages: + yield lineno, funcname, text + + +class MessageBuffer(object): + """Helper class for managing internationalized mixed content. + + :since: version 0.5 + """ + + def __init__(self, lineno=-1): + """Initialize the message buffer. + + :param lineno: the line number on which the first stream event + belonging to the message was found + """ + self.lineno = lineno + self.string = [] + self.events = {} + self.depth = 1 + self.order = 1 + self.stack = [0] + + def append(self, kind, data, pos): + """Append a stream event to the buffer. + + :param kind: the stream event kind + :param data: the event data + :param pos: the position of the event in the source + """ + if kind is TEXT: + self.string.append(data) + self.events.setdefault(self.stack[-1], []).append(None) + else: + if kind is START: + self.string.append(u'[%d:' % self.order) + self.events.setdefault(self.order, []).append((kind, data, pos)) + self.stack.append(self.order) + self.depth += 1 + self.order += 1 + elif kind is END: + self.depth -= 1 + if self.depth: + self.events[self.stack[-1]].append((kind, data, pos)) + self.string.append(u']') + self.stack.pop() + + def format(self): + """Return a message identifier representing the content in the + buffer. + """ + return u''.join(self.string).strip() + + def translate(self, string): + """Interpolate the given message translation with the events in the + buffer and return the translated stream. + + :param string: the translated message string + """ + parts = parse_msg(string) + for order, string in parts: + events = self.events[order] + while events: + event = self.events[order].pop(0) + if not event: + if not string: + break + yield TEXT, string, (None, -1, -1) + if not self.events[order] or not self.events[order][0]: + break + else: + yield event + + +def parse_msg(string, regex=re.compile(r'(?:\[(\d+)\:)|\]')): + """Parse a translated message using Genshi mixed content message + formatting. + + >>> parse_msg("See [1:Help].") + [(0, 'See '), (1, 'Help'), (0, '.')] + + >>> parse_msg("See [1:our [2:Help] page] for details.") + [(0, 'See '), (1, 'our '), (2, 'Help'), (1, ' page'), (0, ' for details.')] + + >>> parse_msg("[2:Details] finden Sie in [1:Hilfe].") + [(2, 'Details'), (0, ' finden Sie in '), (1, 'Hilfe'), (0, '.')] + + >>> parse_msg("[1:] Bilder pro Seite anzeigen.") + [(1, ''), (0, ' Bilder pro Seite anzeigen.')] + + :param string: the translated message string + :return: a list of ``(order, string)`` tuples + :rtype: `list` + """ + parts = [] + stack = [0] + while True: + mo = regex.search(string) + if not mo: + break + + if mo.start() or stack[-1]: + parts.append((stack[-1], string[:mo.start()])) + string = string[mo.end():] + + orderno = mo.group(1) + if orderno is not None: + stack.append(int(orderno)) + else: + stack.pop() + if not stack: + break + + if string: + parts.append((stack[-1], string)) + + return parts + +def extract_from_code(code, gettext_functions): + """Extract strings from Python bytecode. + + >>> from genshi.template.eval import Expression + + >>> expr = Expression('_("Hello")') + >>> list(extract_from_code(expr, Translator.GETTEXT_FUNCTIONS)) + [('_', u'Hello')] + + >>> expr = Expression('ngettext("You have %(num)s item", ' + ... '"You have %(num)s items", num)') + >>> list(extract_from_code(expr, Translator.GETTEXT_FUNCTIONS)) + [('ngettext', (u'You have %(num)s item', u'You have %(num)s items', None))] + + :param code: the `Code` object + :type code: `genshi.template.eval.Code` + :param gettext_functions: a sequence of function names + :since: version 0.5 + """ + def _walk(node): + if isinstance(node, ast.CallFunc) and isinstance(node.node, ast.Name) \ + and node.node.name in gettext_functions: + strings = [] + def _add(arg): + if isinstance(arg, ast.Const) \ + and isinstance(arg.value, basestring): + strings.append(unicode(arg.value, 'utf-8')) + elif arg and not isinstance(arg, ast.Keyword): + strings.append(None) + [_add(arg) for arg in node.args] + _add(node.star_args) + _add(node.dstar_args) + if len(strings) == 1: + strings = strings[0] + else: + strings = tuple(strings) + yield node.node.name, strings + else: + for child in node.getChildNodes(): + for funcname, strings in _walk(child): + yield funcname, strings + return _walk(code.ast) + +def extract(fileobj, keywords, comment_tags, options): + """Babel extraction method for Genshi templates. + + :param fileobj: the file-like object the messages should be extracted from + :param keywords: a list of keywords (i.e. function names) that should be + recognized as translation functions + :param comment_tags: a list of translator tags to search for and include + in the results + :param options: a dictionary of additional options (optional) + :return: an iterator over ``(lineno, funcname, message, comments)`` tuples + :rtype: ``iterator`` + """ + template_class = options.get('template_class', MarkupTemplate) + if isinstance(template_class, basestring): + module, clsname = template_class.split(':', 1) + template_class = getattr(__import__(module, {}, {}, [clsname]), clsname) + encoding = options.get('encoding', None) + + extract_text = options.get('extract_text', True) + if isinstance(extract_text, basestring): + extract_text = extract_text.lower() in ('1', 'on', 'yes', 'true') + + ignore_tags = options.get('ignore_tags', Translator.IGNORE_TAGS) + if isinstance(ignore_tags, basestring): + ignore_tags = ignore_tags.split() + ignore_tags = [QName(tag) for tag in ignore_tags] + + include_attrs = options.get('include_attrs', Translator.INCLUDE_ATTRS) + if isinstance(include_attrs, basestring): + include_attrs = include_attrs.split() + include_attrs = [QName(attr) for attr in include_attrs] + + tmpl = template_class(fileobj, filename=getattr(fileobj, 'name', None), + encoding=encoding) + translator = Translator(None, ignore_tags, include_attrs, extract_text) + for lineno, func, message in translator.extract(tmpl.stream, + gettext_functions=keywords): + yield lineno, func, message, [] diff --git a/src/calibre/utils/genshi/filters/transform.py b/src/calibre/utils/genshi/filters/transform.py new file mode 100644 index 0000000000..5320f01cba --- /dev/null +++ b/src/calibre/utils/genshi/filters/transform.py @@ -0,0 +1,1309 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""A filter for functional-style transformations of markup streams. + +The `Transformer` filter provides a variety of transformations that can be +applied to parts of streams that match given XPath expressions. These +transformations can be chained to achieve results that would be comparitively +tedious to achieve by writing stream filters by hand. The approach of chaining +node selection and transformation has been inspired by the `jQuery`_ Javascript +library. + + .. _`jQuery`: http://jquery.com/ + +For example, the following transformation removes the ```` element from +the ``<head>`` of the input document: + +>>> from genshi.builder import tag +>>> html = HTML('''<html> +... <head><title>Some Title +... +... Some body text. +... +... ''') +>>> print html | Transformer('body/em').map(unicode.upper, TEXT) \\ +... .unwrap().wrap(tag.u) + + Some Title + + Some BODY text. + + + +The ``Transformer`` support a large number of useful transformations out of the +box, but custom transformations can be added easily. + +:since: version 0.5 +""" + +import re +import sys + +from calibre.utils.genshi.builder import Element +from calibre.utils.genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure, Markup +from calibre.utils.genshi.path import Path + +__all__ = ['Transformer', 'StreamBuffer', 'InjectorTransformation', 'ENTER', + 'EXIT', 'INSIDE', 'OUTSIDE', 'BREAK'] + + +class TransformMark(str): + """A mark on a transformation stream.""" + __slots__ = [] + _instances = {} + + def __new__(cls, val): + return cls._instances.setdefault(val, str.__new__(cls, val)) + + +ENTER = TransformMark('ENTER') +"""Stream augmentation mark indicating that a selected element is being +entered.""" + +INSIDE = TransformMark('INSIDE') +"""Stream augmentation mark indicating that processing is currently inside a +selected element.""" + +OUTSIDE = TransformMark('OUTSIDE') +"""Stream augmentation mark indicating that a match occurred outside a selected +element.""" + +ATTR = TransformMark('ATTR') +"""Stream augmentation mark indicating a selected element attribute.""" + +EXIT = TransformMark('EXIT') +"""Stream augmentation mark indicating that a selected element is being +exited.""" + +BREAK = TransformMark('BREAK') +"""Stream augmentation mark indicating a break between two otherwise contiguous +blocks of marked events. + +This is used primarily by the cut() transform to provide later transforms with +an opportunity to operate on the cut buffer. +""" + + +class PushBackStream(object): + """Allows a single event to be pushed back onto the stream and re-consumed. + """ + def __init__(self, stream): + self.stream = iter(stream) + self.peek = None + + def push(self, event): + assert self.peek is None + self.peek = event + + def __iter__(self): + while True: + if self.peek is not None: + peek = self.peek + self.peek = None + yield peek + else: + try: + event = self.stream.next() + yield event + except StopIteration: + if self.peek is None: + raise + + +class Transformer(object): + """Stream filter that can apply a variety of different transformations to + a stream. + + This is achieved by selecting the events to be transformed using XPath, + then applying the transformations to the events matched by the path + expression. Each marked event is in the form (mark, (kind, data, pos)), + where mark can be any of `ENTER`, `INSIDE`, `EXIT`, `OUTSIDE`, or `None`. + + The first three marks match `START` and `END` events, and any events + contained `INSIDE` any selected XML/HTML element. A non-element match + outside a `START`/`END` container (e.g. ``text()``) will yield an `OUTSIDE` + mark. + + >>> html = HTML('Some Title' + ... 'Some body text.') + + Transformations act on selected stream events matching an XPath expression. + Here's an example of removing some markup (the title, in this case) + selected by an expression: + + >>> print html | Transformer('head/title').remove() + Some body text. + + Inserted content can be passed in the form of a string, or a markup event + stream, which includes streams generated programmatically via the + `builder` module: + + >>> from genshi.builder import tag + >>> print html | Transformer('body').prepend(tag.h1('Document Title')) + Some Title

          Document + Title

          Some body text. + + Each XPath expression determines the set of tags that will be acted upon by + subsequent transformations. In this example we select the ```` text, + copy it into a buffer, then select the ``<body>`` element and paste the + copied text into the body as ``<h1>`` enclosed text: + + >>> buffer = StreamBuffer() + >>> print html | Transformer('head/title/text()').copy(buffer) \\ + ... .end().select('body').prepend(tag.h1(buffer)) + <html><head><title>Some Title

          Some Title

          Some + body text. + + Transformations can also be assigned and reused, although care must be + taken when using buffers, to ensure that buffers are cleared between + transforms: + + >>> emphasis = Transformer('body//em').attr('class', 'emphasis') + >>> print html | emphasis + Some TitleSome body text. + """ + + __slots__ = ['transforms'] + + def __init__(self, path='.'): + """Construct a new transformation filter. + + :param path: an XPath expression (as string) or a `Path` instance + """ + self.transforms = [SelectTransformation(path)] + + def __call__(self, stream, keep_marks=False): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + :param keep_marks: Do not strip transformer selection marks from the + stream. Useful for testing. + :return: the transformed stream + :rtype: `Stream` + """ + transforms = self._mark(stream) + for link in self.transforms: + transforms = link(transforms) + if not keep_marks: + transforms = self._unmark(transforms) + return Stream(transforms, + serializer=getattr(stream, 'serializer', None)) + + def apply(self, function): + """Apply a transformation to the stream. + + Transformations can be chained, similar to stream filters. Any callable + accepting a marked stream can be used as a transform. + + As an example, here is a simple `TEXT` event upper-casing transform: + + >>> def upper(stream): + ... for mark, (kind, data, pos) in stream: + ... if mark and kind is TEXT: + ... yield mark, (kind, data.upper(), pos) + ... else: + ... yield mark, (kind, data, pos) + >>> short_stream = HTML('Some test text') + >>> print short_stream | Transformer('.//em/text()').apply(upper) + Some TEST text + """ + transformer = Transformer() + transformer.transforms = self.transforms[:] + if isinstance(function, Transformer): + transformer.transforms.extend(function.transforms) + else: + transformer.transforms.append(function) + return transformer + + #{ Selection operations + + def select(self, path): + """Mark events matching the given XPath expression, within the current + selection. + + >>> html = HTML('Some test text') + >>> print html | Transformer().select('.//em').trace() + (None, ('START', (QName(u'body'), Attrs()), (None, 1, 0))) + (None, ('TEXT', u'Some ', (None, 1, 6))) + ('ENTER', ('START', (QName(u'em'), Attrs()), (None, 1, 11))) + ('INSIDE', ('TEXT', u'test', (None, 1, 15))) + ('EXIT', ('END', QName(u'em'), (None, 1, 19))) + (None, ('TEXT', u' text', (None, 1, 24))) + (None, ('END', QName(u'body'), (None, 1, 29))) + Some test text + + :param path: an XPath expression (as string) or a `Path` instance + :return: the stream augmented by transformation marks + :rtype: `Transformer` + """ + return self.apply(SelectTransformation(path)) + + def invert(self): + """Invert selection so that marked events become unmarked, and vice + versa. + + Specificaly, all marks are converted to null marks, and all null marks + are converted to OUTSIDE marks. + + >>> html = HTML('Some test text') + >>> print html | Transformer('//em').invert().trace() + ('OUTSIDE', ('START', (QName(u'body'), Attrs()), (None, 1, 0))) + ('OUTSIDE', ('TEXT', u'Some ', (None, 1, 6))) + (None, ('START', (QName(u'em'), Attrs()), (None, 1, 11))) + (None, ('TEXT', u'test', (None, 1, 15))) + (None, ('END', QName(u'em'), (None, 1, 19))) + ('OUTSIDE', ('TEXT', u' text', (None, 1, 24))) + ('OUTSIDE', ('END', QName(u'body'), (None, 1, 29))) + Some test text + + :rtype: `Transformer` + """ + return self.apply(InvertTransformation()) + + def end(self): + """End current selection, allowing all events to be selected. + + Example: + + >>> html = HTML('Some test text') + >>> print html | Transformer('//em').end().trace() + ('OUTSIDE', ('START', (QName(u'body'), Attrs()), (None, 1, 0))) + ('OUTSIDE', ('TEXT', u'Some ', (None, 1, 6))) + ('OUTSIDE', ('START', (QName(u'em'), Attrs()), (None, 1, 11))) + ('OUTSIDE', ('TEXT', u'test', (None, 1, 15))) + ('OUTSIDE', ('END', QName(u'em'), (None, 1, 19))) + ('OUTSIDE', ('TEXT', u' text', (None, 1, 24))) + ('OUTSIDE', ('END', QName(u'body'), (None, 1, 29))) + Some test text + + :return: the stream augmented by transformation marks + :rtype: `Transformer` + """ + return self.apply(EndTransformation()) + + #{ Deletion operations + + def empty(self): + """Empty selected elements of all content. + + Example: + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').empty() + Some TitleSome + text. + + :rtype: `Transformer` + """ + return self.apply(EmptyTransformation()) + + def remove(self): + """Remove selection from the stream. + + Example: + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').remove() + Some TitleSome + text. + + :rtype: `Transformer` + """ + return self.apply(RemoveTransformation()) + + #{ Direct element operations + + def unwrap(self): + """Remove outermost enclosing elements from selection. + + Example: + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').unwrap() + Some TitleSome body + text. + + :rtype: `Transformer` + """ + return self.apply(UnwrapTransformation()) + + def wrap(self, element): + """Wrap selection in an element. + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').wrap('strong') + Some TitleSome + body text. + + :param element: either a tag name (as string) or an `Element` object + :rtype: `Transformer` + """ + return self.apply(WrapTransformation(element)) + + #{ Content insertion operations + + def replace(self, content): + """Replace selection with content. + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//title/text()').replace('New Title') + New TitleSome body + text. + + :param content: Either a callable, an iterable of events, or a string + to insert. + :rtype: `Transformer` + """ + return self.apply(ReplaceTransformation(content)) + + def before(self, content): + """Insert content before selection. + + In this example we insert the word 'emphasised' before the opening + tag: + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').before('emphasised ') + Some TitleSome emphasised + body text. + + :param content: Either a callable, an iterable of events, or a string + to insert. + :rtype: `Transformer` + """ + return self.apply(BeforeTransformation(content)) + + def after(self, content): + """Insert content after selection. + + Here, we insert some text after the closing tag: + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em').after(' rock') + Some TitleSome body + rock text. + + :param content: Either a callable, an iterable of events, or a string + to insert. + :rtype: `Transformer` + """ + return self.apply(AfterTransformation(content)) + + def prepend(self, content): + """Insert content after the ENTER event of the selection. + + Inserting some new text at the start of the : + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//body').prepend('Some new body text. ') + Some TitleSome new body text. + Some body text. + + :param content: Either a callable, an iterable of events, or a string + to insert. + :rtype: `Transformer` + """ + return self.apply(PrependTransformation(content)) + + def append(self, content): + """Insert content before the END event of the selection. + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//body').append(' Some new body text.') + Some TitleSome body + text. Some new body text. + + :param content: Either a callable, an iterable of events, or a string + to insert. + :rtype: `Transformer` + """ + return self.apply(AppendTransformation(content)) + + #{ Attribute manipulation + + def attr(self, name, value): + """Add, replace or delete an attribute on selected elements. + + If `value` evaulates to `None` the attribute will be deleted from the + element: + + >>> html = HTML('Some Title' + ... 'Some body text.' + ... '') + >>> print html | Transformer('body/em').attr('class', None) + Some TitleSome body + text. + + Otherwise the attribute will be set to `value`: + + >>> print html | Transformer('body/em').attr('class', 'emphasis') + Some TitleSome body text. + + If `value` is a callable it will be called with the attribute name and + the `START` event for the matching element. Its return value will then + be used to set the attribute: + + >>> def print_attr(name, event): + ... attrs = event[1][1] + ... print attrs + ... return attrs.get(name) + >>> print html | Transformer('body/em').attr('class', print_attr) + Attrs([(QName(u'class'), u'before')]) + Attrs() + Some TitleSome body text. + + :param name: the name of the attribute + :param value: the value that should be set for the attribute. + :rtype: `Transformer` + """ + return self.apply(AttrTransformation(name, value)) + + #{ Buffer operations + + def copy(self, buffer, accumulate=False): + """Copy selection into buffer. + + The buffer is replaced by each *contiguous* selection before being passed + to the next transformation. If accumulate=True, further selections will + be appended to the buffer rather than replacing it. + + >>> from calibre.utils.genshi.builder import tag + >>> buffer = StreamBuffer() + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('title/text()').copy(buffer) \\ + ... .end().select('body').prepend(tag.h1(buffer)) + Some Title

          Some + Title

          Some body text. + + This example illustrates that only a single contiguous selection will + be buffered: + + >>> print html | Transformer('head/title/text()').copy(buffer) \\ + ... .end().select('body/em').copy(buffer).end().select('body') \\ + ... .prepend(tag.h1(buffer)) + Some Title

          Some + Title

          Some body text. + >>> print buffer + body + + Element attributes can also be copied for later use: + + >>> html = HTML('Some Title' + ... 'Some body' + ... 'text.') + >>> buffer = StreamBuffer() + >>> def apply_attr(name, entry): + ... return list(buffer)[0][1][1].get('class') + >>> print html | Transformer('body/em[@class]/@class').copy(buffer) \\ + ... .end().buffer().select('body/em[not(@class)]') \\ + ... .attr('class', apply_attr) + Some TitleSome bodytext. + + + :param buffer: the `StreamBuffer` in which the selection should be + stored + :rtype: `Transformer` + note: Copy (and cut) copy each individual selected object into the + buffer before passing to the next transform. For example, the + XPath ``*|text()`` will select all elements and text, each + instance of which will be copied to the buffer individually + before passing to the next transform. This has implications for + how ``StreamBuffer`` objects can be used, so some + experimentation may be required. + + """ + return self.apply(CopyTransformation(buffer, accumulate)) + + def cut(self, buffer, accumulate=False): + """Copy selection into buffer and remove the selection from the stream. + + >>> from calibre.utils.genshi.builder import tag + >>> buffer = StreamBuffer() + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('.//em/text()').cut(buffer) \\ + ... .end().select('.//em').after(tag.h1(buffer)) + Some TitleSome +

          body

          text. + + Specifying accumulate=True, appends all selected intervals onto the + buffer. Combining this with the .buffer() operation allows us operate + on all copied events rather than per-segment. See the documentation on + buffer() for more information. + + :param buffer: the `StreamBuffer` in which the selection should be + stored + :rtype: `Transformer` + :note: this transformation will buffer the entire input stream + """ + return self.apply(CutTransformation(buffer, accumulate)) + + def buffer(self): + """Buffer the entire stream (can consume a considerable amount of + memory). + + Useful in conjunction with copy(accumulate=True) and + cut(accumulate=True) to ensure that all marked events in the entire + stream are copied to the buffer before further transformations are + applied. + + For example, to move all elements inside a tag at the + top of the document: + + >>> doc = HTML('Some one ' + ... 'text two.') + >>> buffer = StreamBuffer() + >>> print doc | Transformer('body/note').cut(buffer, accumulate=True) \\ + ... .end().buffer().select('notes').prepend(buffer) + onetwoSome text + . + + """ + return self.apply(list) + + #{ Miscellaneous operations + + def filter(self, filter): + """Apply a normal stream filter to the selection. The filter is called + once for each contiguous block of marked events. + + >>> from genshi.filters.html import HTMLSanitizer + >>> html = HTML('Some text and some more text') + >>> print html | Transformer('body/*').filter(HTMLSanitizer()) + Some text and some more text + + :param filter: The stream filter to apply. + :rtype: `Transformer` + """ + return self.apply(FilterTransformation(filter)) + + def map(self, function, kind): + """Applies a function to the ``data`` element of events of ``kind`` in + the selection. + + >>> html = HTML('Some Title' + ... 'Some body text.') + >>> print html | Transformer('head/title').map(unicode.upper, TEXT) + SOME TITLESome body + text. + + :param function: the function to apply + :param kind: the kind of event the function should be applied to + :rtype: `Transformer` + """ + return self.apply(MapTransformation(function, kind)) + + def substitute(self, pattern, replace, count=1): + """Replace text matching a regular expression. + + Refer to the documentation for ``re.sub()`` for details. + + >>> html = HTML('Some text, some more text and ' + ... 'some bold text\\n' + ... 'some italicised text') + >>> print html | Transformer('body/b').substitute('(?i)some', 'SOME') + Some text, some more text and SOME bold text + some italicised text + >>> tags = tag.html(tag.body('Some text, some more text and\\n', + ... Markup('some bold text'))) + >>> print tags.generate() | Transformer('body').substitute( + ... '(?i)some', 'SOME') + SOME text, some more text and + SOME bold text + + :param pattern: A regular expression object or string. + :param replace: Replacement pattern. + :param count: Number of replacements to make in each text fragment. + :rtype: `Transformer` + """ + return self.apply(SubstituteTransformation(pattern, replace, count)) + + def rename(self, name): + """Rename matching elements. + + >>> html = HTML('Some text, some more text and ' + ... 'some bold text') + >>> print html | Transformer('body/b').rename('strong') + Some text, some more text and some bold text + """ + return self.apply(RenameTransformation(name)) + + def trace(self, prefix='', fileobj=None): + """Print events as they pass through the transform. + + >>> html = HTML('Some test text') + >>> print html | Transformer('em').trace() + (None, ('START', (QName(u'body'), Attrs()), (None, 1, 0))) + (None, ('TEXT', u'Some ', (None, 1, 6))) + ('ENTER', ('START', (QName(u'em'), Attrs()), (None, 1, 11))) + ('INSIDE', ('TEXT', u'test', (None, 1, 15))) + ('EXIT', ('END', QName(u'em'), (None, 1, 19))) + (None, ('TEXT', u' text', (None, 1, 24))) + (None, ('END', QName(u'body'), (None, 1, 29))) + Some test text + + :param prefix: a string to prefix each event with in the output + :param fileobj: the writable file-like object to write to; defaults to + the standard output stream + :rtype: `Transformer` + """ + return self.apply(TraceTransformation(prefix, fileobj=fileobj)) + + # Internal methods + + def _mark(self, stream): + for event in stream: + yield OUTSIDE, event + + def _unmark(self, stream): + for mark, event in stream: + kind = event[0] + if not (kind is None or kind is ATTR or kind is BREAK): + yield event + + +class SelectTransformation(object): + """Select and mark events that match an XPath expression.""" + + def __init__(self, path): + """Create selection. + + :param path: an XPath expression (as string) or a `Path` object + """ + if not isinstance(path, Path): + path = Path(path) + self.path = path + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + namespaces = {} + variables = {} + test = self.path.test() + stream = iter(stream) + for mark, event in stream: + if mark is None: + yield mark, event + continue + result = test(event, {}, {}) + # XXX This is effectively genshi.core._ensure() for transform + # streams. + if result is True: + if event[0] is START: + yield ENTER, event + depth = 1 + while depth > 0: + mark, subevent = stream.next() + if subevent[0] is START: + depth += 1 + elif subevent[0] is END: + depth -= 1 + if depth == 0: + yield EXIT, subevent + else: + yield INSIDE, subevent + test(subevent, {}, {}, updateonly=True) + else: + yield OUTSIDE, event + elif isinstance(result, Attrs): + # XXX Selected *attributes* are given a "kind" of None to + # indicate they are not really part of the stream. + yield ATTR, (ATTR, (QName(event[1][0] + '@*'), result), event[2]) + yield None, event + elif isinstance(result, tuple): + yield OUTSIDE, result + elif result: + # XXX Assume everything else is "text"? + yield None, (TEXT, unicode(result), (None, -1, -1)) + else: + yield None, event + + +class InvertTransformation(object): + """Invert selection so that marked events become unmarked, and vice versa. + + Specificaly, all input marks are converted to null marks, and all input + null marks are converted to OUTSIDE marks. + """ + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for mark, event in stream: + if mark: + yield None, event + else: + yield OUTSIDE, event + + +class EndTransformation(object): + """End the current selection.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for mark, event in stream: + yield OUTSIDE, event + + +class EmptyTransformation(object): + """Empty selected elements of all content.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for mark, event in stream: + yield mark, event + if mark is ENTER: + for mark, event in stream: + if mark is EXIT: + yield mark, event + break + + +class RemoveTransformation(object): + """Remove selection from the stream.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for mark, event in stream: + if mark is None: + yield mark, event + + +class UnwrapTransformation(object): + """Remove outtermost enclosing elements from selection.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for mark, event in stream: + if mark not in (ENTER, EXIT): + yield mark, event + + +class WrapTransformation(object): + """Wrap selection in an element.""" + + def __init__(self, element): + if isinstance(element, Element): + self.element = element + else: + self.element = Element(element) + + def __call__(self, stream): + for mark, event in stream: + if mark: + element = list(self.element.generate()) + for prefix in element[:-1]: + yield None, prefix + yield mark, event + start = mark + stopped = False + for mark, event in stream: + if start is ENTER and mark is EXIT: + yield mark, event + stopped = True + break + if not mark: + break + yield mark, event + else: + stopped = True + yield None, element[-1] + if not stopped: + yield mark, event + else: + yield mark, event + + +class TraceTransformation(object): + """Print events as they pass through the transform.""" + + def __init__(self, prefix='', fileobj=None): + """Trace constructor. + + :param prefix: text to prefix each traced line with. + :param fileobj: the writable file-like object to write to + """ + self.prefix = prefix + self.fileobj = fileobj or sys.stdout + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + for event in stream: + print>>self.fileobj, self.prefix + str(event) + yield event + + +class FilterTransformation(object): + """Apply a normal stream filter to the selection. The filter is called once + for each selection.""" + + def __init__(self, filter): + """Create the transform. + + :param filter: The stream filter to apply. + """ + self.filter = filter + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + def flush(queue): + if queue: + for event in self.filter(queue): + yield OUTSIDE, event + del queue[:] + + queue = [] + for mark, event in stream: + if mark is ENTER: + queue.append(event) + for mark, event in stream: + queue.append(event) + if mark is EXIT: + break + for queue_event in flush(queue): + yield queue_event + elif mark is OUTSIDE: + stopped = True + queue.append(event) + for mark, event in stream: + if mark is not OUTSIDE: + break + queue.append(event) + else: + stopped = True + for queue_event in flush(queue): + yield queue_event + if not stopped: + yield None, event + else: + yield mark, event + for queue_event in flush(queue): + yield queue_event + + +class MapTransformation(object): + """Apply a function to the `data` element of events of ``kind`` in the + selection. + """ + + def __init__(self, function, kind): + """Create the transform. + + :param function: the function to apply; the function must take one + argument, the `data` element of each selected event + :param kind: the stream event ``kind`` to apply the `function` to + """ + self.function = function + self.kind = kind + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, (kind, data, pos) in stream: + if mark and self.kind in (None, kind): + yield mark, (kind, self.function(data), pos) + else: + yield mark, (kind, data, pos) + + +class SubstituteTransformation(object): + """Replace text matching a regular expression. + + Refer to the documentation for ``re.sub()`` for details. + """ + def __init__(self, pattern, replace, count=0): + """Create the transform. + + :param pattern: A regular expression object, or string. + :param replace: Replacement pattern. + :param count: Number of replacements to make in each text fragment. + """ + if isinstance(pattern, basestring): + self.pattern = re.compile(pattern) + else: + self.pattern = pattern + self.count = count + self.replace = replace + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, (kind, data, pos) in stream: + if mark is not None and kind is TEXT: + new_data = self.pattern.sub(self.replace, data, self.count) + if isinstance(data, Markup): + data = Markup(new_data) + else: + data = new_data + yield mark, (kind, data, pos) + + +class RenameTransformation(object): + """Rename matching elements.""" + def __init__(self, name): + """Create the transform. + + :param name: New element name. + """ + self.name = QName(name) + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, (kind, data, pos) in stream: + if mark is ENTER: + data = self.name, data[1] + elif mark is EXIT: + data = self.name + yield mark, (kind, data, pos) + + +class InjectorTransformation(object): + """Abstract base class for transformations that inject content into a + stream. + + >>> class Top(InjectorTransformation): + ... def __call__(self, stream): + ... for event in self._inject(): + ... yield event + ... for event in stream: + ... yield event + >>> html = HTML('Some test text') + >>> print html | Transformer('.//em').apply(Top('Prefix ')) + Prefix Some test text + """ + def __init__(self, content): + """Create a new injector. + + :param content: An iterable of Genshi stream events, or a string to be + injected. + """ + self.content = content + + def _inject(self): + content = self.content + if callable(content): + content = content() + for event in _ensure(content): + yield None, event + + +class ReplaceTransformation(InjectorTransformation): + """Replace selection with content.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + stream = PushBackStream(stream) + for mark, event in stream: + if mark is not None: + start = mark + for subevent in self._inject(): + yield subevent + for mark, event in stream: + if start is ENTER: + if mark is EXIT: + break + elif mark != start: + stream.push((mark, event)) + break + else: + yield mark, event + + +class BeforeTransformation(InjectorTransformation): + """Insert content before selection.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + stream = PushBackStream(stream) + for mark, event in stream: + if mark is not None: + start = mark + for subevent in self._inject(): + yield subevent + yield mark, event + for mark, event in stream: + if mark != start and start is not ENTER: + stream.push((mark, event)) + break + yield mark, event + if start is ENTER and mark is EXIT: + break + else: + yield mark, event + + +class AfterTransformation(InjectorTransformation): + """Insert content after selection.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + stream = PushBackStream(stream) + for mark, event in stream: + yield mark, event + if mark: + start = mark + for mark, event in stream: + if start is not ENTER and mark != start: + stream.push((mark, event)) + break + yield mark, event + if start is ENTER and mark is EXIT: + break + for subevent in self._inject(): + yield subevent + + +class PrependTransformation(InjectorTransformation): + """Prepend content to the inside of selected elements.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, event in stream: + yield mark, event + if mark is ENTER: + for subevent in self._inject(): + yield subevent + + +class AppendTransformation(InjectorTransformation): + """Append content after the content of selected elements.""" + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, event in stream: + yield mark, event + if mark is ENTER: + for mark, event in stream: + if mark is EXIT: + break + yield mark, event + for subevent in self._inject(): + yield subevent + yield mark, event + + +class AttrTransformation(object): + """Set an attribute on selected elements.""" + + def __init__(self, name, value): + """Construct transform. + + :param name: name of the attribute that should be set + :param value: the value to set + """ + self.name = name + self.value = value + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + callable_value = callable(self.value) + for mark, (kind, data, pos) in stream: + if mark is ENTER: + if callable_value: + value = self.value(self.name, (kind, data, pos)) + else: + value = self.value + if value is None: + attrs = data[1] - [QName(self.name)] + else: + attrs = data[1] | [(QName(self.name), value)] + data = (data[0], attrs) + yield mark, (kind, data, pos) + + + +class StreamBuffer(Stream): + """Stream event buffer used for cut and copy transformations.""" + + def __init__(self): + """Create the buffer.""" + Stream.__init__(self, []) + + def append(self, event): + """Add an event to the buffer. + + :param event: the markup event to add + """ + self.events.append(event) + + def reset(self): + """Empty the buffer of events.""" + del self.events[:] + + +class CopyTransformation(object): + """Copy selected events into a buffer for later insertion.""" + + def __init__(self, buffer, accumulate=False): + """Create the copy transformation. + + :param buffer: the `StreamBuffer` in which the selection should be + stored + """ + if not accumulate: + buffer.reset() + self.buffer = buffer + self.accumulate = accumulate + + def __call__(self, stream): + """Apply the transformation to the marked stream. + + :param stream: the marked event stream to filter + """ + stream = PushBackStream(stream) + + for mark, event in stream: + if mark: + if not self.accumulate: + self.buffer.reset() + events = [(mark, event)] + self.buffer.append(event) + start = mark + for mark, event in stream: + if start is not ENTER and mark != start: + stream.push((mark, event)) + break + events.append((mark, event)) + self.buffer.append(event) + if start is ENTER and mark is EXIT: + break + for i in events: + yield i + else: + yield mark, event + + +class CutTransformation(object): + """Cut selected events into a buffer for later insertion and remove the + selection. + """ + + def __init__(self, buffer, accumulate=False): + """Create the cut transformation. + + :param buffer: the `StreamBuffer` in which the selection should be + stored + """ + self.buffer = buffer + self.accumulate = accumulate + + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: the marked event stream to filter + """ + attributes = [] + stream = PushBackStream(stream) + broken = False + if not self.accumulate: + self.buffer.reset() + for mark, event in stream: + if mark: + # Send a BREAK event if there was no other event sent between + if not self.accumulate: + if not broken and self.buffer: + yield BREAK, (BREAK, None, None) + self.buffer.reset() + self.buffer.append(event) + start = mark + if mark is ATTR: + attributes.extend([name for name, _ in event[1][1]]) + for mark, event in stream: + if start is mark is ATTR: + attributes.extend([name for name, _ in event[1][1]]) + # Handle non-element contiguous selection + if start is not ENTER and mark != start: + # Operating on the attributes of a START event + if start is ATTR: + kind, data, pos = event + assert kind is START + data = (data[0], data[1] - attributes) + attributes = None + stream.push((mark, (kind, data, pos))) + else: + stream.push((mark, event)) + break + self.buffer.append(event) + if start is ENTER and mark is EXIT: + break + broken = False + else: + broken = True + yield mark, event + if not broken and self.buffer: + yield BREAK, (BREAK, None, None) diff --git a/src/calibre/utils/genshi/input.py b/src/calibre/utils/genshi/input.py new file mode 100644 index 0000000000..32ad50f690 --- /dev/null +++ b/src/calibre/utils/genshi/input.py @@ -0,0 +1,449 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Support for constructing markup streams from files, strings, or other +sources. +""" + +from itertools import chain +from xml.parsers import expat +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset +import HTMLParser as html +import htmlentitydefs +from StringIO import StringIO + +from calibre.utils.genshi.core import Attrs, QName, Stream, stripentities +from calibre.utils.genshi.core import START, END, XML_DECL, DOCTYPE, TEXT, START_NS, END_NS, \ + START_CDATA, END_CDATA, PI, COMMENT + +__all__ = ['ET', 'ParseError', 'XMLParser', 'XML', 'HTMLParser', 'HTML'] +__docformat__ = 'restructuredtext en' + +def ET(element): + """Convert a given ElementTree element to a markup stream. + + :param element: an ElementTree element + :return: a markup stream + """ + tag_name = QName(element.tag.lstrip('{')) + attrs = Attrs([(QName(attr.lstrip('{')), value) + for attr, value in element.items()]) + + yield START, (tag_name, attrs), (None, -1, -1) + if element.text: + yield TEXT, element.text, (None, -1, -1) + for child in element.getchildren(): + for item in ET(child): + yield item + yield END, tag_name, (None, -1, -1) + if element.tail: + yield TEXT, element.tail, (None, -1, -1) + + +class ParseError(Exception): + """Exception raised when fatal syntax errors are found in the input being + parsed. + """ + + def __init__(self, message, filename=None, lineno=-1, offset=-1): + """Exception initializer. + + :param message: the error message from the parser + :param filename: the path to the file that was parsed + :param lineno: the number of the line on which the error was encountered + :param offset: the column number where the error was encountered + """ + self.msg = message + if filename: + message += ', in ' + filename + Exception.__init__(self, message) + self.filename = filename or '' + self.lineno = lineno + self.offset = offset + + +class XMLParser(object): + """Generator-based XML parser based on roughly equivalent code in + Kid/ElementTree. + + The parsing is initiated by iterating over the parser object: + + >>> parser = XMLParser(StringIO('Foo')) + >>> for kind, data, pos in parser: + ... print kind, data + START (QName(u'root'), Attrs([(QName(u'id'), u'2')])) + START (QName(u'child'), Attrs()) + TEXT Foo + END child + END root + """ + + _entitydefs = ['' % (name, value) for name, value in + htmlentitydefs.name2codepoint.items()] + _external_dtd = '\n'.join(_entitydefs) + + def __init__(self, source, filename=None, encoding=None): + """Initialize the parser for the given XML input. + + :param source: the XML text as a file-like object + :param filename: the name of the file, if appropriate + :param encoding: the encoding of the file; if not specified, the + encoding is assumed to be ASCII, UTF-8, or UTF-16, or + whatever the encoding specified in the XML declaration + (if any) + """ + self.source = source + self.filename = filename + + # Setup the Expat parser + parser = expat.ParserCreate(encoding, '}') + parser.buffer_text = True + parser.returns_unicode = True + parser.ordered_attributes = True + + parser.StartElementHandler = self._handle_start + parser.EndElementHandler = self._handle_end + parser.CharacterDataHandler = self._handle_data + parser.StartDoctypeDeclHandler = self._handle_doctype + parser.StartNamespaceDeclHandler = self._handle_start_ns + parser.EndNamespaceDeclHandler = self._handle_end_ns + parser.StartCdataSectionHandler = self._handle_start_cdata + parser.EndCdataSectionHandler = self._handle_end_cdata + parser.ProcessingInstructionHandler = self._handle_pi + parser.XmlDeclHandler = self._handle_xml_decl + parser.CommentHandler = self._handle_comment + + # Tell Expat that we'll handle non-XML entities ourselves + # (in _handle_other) + parser.DefaultHandler = self._handle_other + parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS) + parser.UseForeignDTD() + parser.ExternalEntityRefHandler = self._build_foreign + + # Location reporting is only support in Python >= 2.4 + if not hasattr(parser, 'CurrentLineNumber'): + self._getpos = self._getpos_unknown + + self.expat = parser + self._queue = [] + + def parse(self): + """Generator that parses the XML source, yielding markup events. + + :return: a markup event stream + :raises ParseError: if the XML text is not well formed + """ + def _generate(): + try: + bufsize = 4 * 1024 # 4K + done = False + while 1: + while not done and len(self._queue) == 0: + data = self.source.read(bufsize) + if data == '': # end of data + if hasattr(self, 'expat'): + self.expat.Parse('', True) + del self.expat # get rid of circular references + done = True + else: + if isinstance(data, unicode): + data = data.encode('utf-8') + self.expat.Parse(data, False) + for event in self._queue: + yield event + self._queue = [] + if done: + break + except expat.ExpatError, e: + msg = str(e) + raise ParseError(msg, self.filename, e.lineno, e.offset) + return Stream(_generate()).filter(_coalesce) + + def __iter__(self): + return iter(self.parse()) + + def _build_foreign(self, context, base, sysid, pubid): + parser = self.expat.ExternalEntityParserCreate(context) + parser.ParseFile(StringIO(self._external_dtd)) + return 1 + + def _enqueue(self, kind, data=None, pos=None): + if pos is None: + pos = self._getpos() + if kind is TEXT: + # Expat reports the *end* of the text event as current position. We + # try to fix that up here as much as possible. Unfortunately, the + # offset is only valid for single-line text. For multi-line text, + # it is apparently not possible to determine at what offset it + # started + if '\n' in data: + lines = data.splitlines() + lineno = pos[1] - len(lines) + 1 + offset = -1 + else: + lineno = pos[1] + offset = pos[2] - len(data) + pos = (pos[0], lineno, offset) + self._queue.append((kind, data, pos)) + + def _getpos_unknown(self): + return (self.filename, -1, -1) + + def _getpos(self): + return (self.filename, self.expat.CurrentLineNumber, + self.expat.CurrentColumnNumber) + + def _handle_start(self, tag, attrib): + attrs = Attrs([(QName(name), value) for name, value in + zip(*[iter(attrib)] * 2)]) + self._enqueue(START, (QName(tag), attrs)) + + def _handle_end(self, tag): + self._enqueue(END, QName(tag)) + + def _handle_data(self, text): + self._enqueue(TEXT, text) + + def _handle_xml_decl(self, version, encoding, standalone): + self._enqueue(XML_DECL, (version, encoding, standalone)) + + def _handle_doctype(self, name, sysid, pubid, has_internal_subset): + self._enqueue(DOCTYPE, (name, pubid, sysid)) + + def _handle_start_ns(self, prefix, uri): + self._enqueue(START_NS, (prefix or '', uri)) + + def _handle_end_ns(self, prefix): + self._enqueue(END_NS, prefix or '') + + def _handle_start_cdata(self): + self._enqueue(START_CDATA) + + def _handle_end_cdata(self): + self._enqueue(END_CDATA) + + def _handle_pi(self, target, data): + self._enqueue(PI, (target, data)) + + def _handle_comment(self, text): + self._enqueue(COMMENT, text) + + def _handle_other(self, text): + if text.startswith('&'): + # deal with undefined entities + try: + text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) + self._enqueue(TEXT, text) + except KeyError: + filename, lineno, offset = self._getpos() + error = expat.error('undefined entity "%s": line %d, column %d' + % (text, lineno, offset)) + error.code = expat.errors.XML_ERROR_UNDEFINED_ENTITY + error.lineno = lineno + error.offset = offset + raise error + + +def XML(text): + """Parse the given XML source and return a markup stream. + + Unlike with `XMLParser`, the returned stream is reusable, meaning it can be + iterated over multiple times: + + >>> xml = XML('FooBar') + >>> print xml + FooBar + >>> print xml.select('elem') + FooBar + >>> print xml.select('elem/text()') + FooBar + + :param text: the XML source + :return: the parsed XML event stream + :raises ParseError: if the XML text is not well-formed + """ + return Stream(list(XMLParser(StringIO(text)))) + + +class HTMLParser(html.HTMLParser, object): + """Parser for HTML input based on the Python `HTMLParser` module. + + This class provides the same interface for generating stream events as + `XMLParser`, and attempts to automatically balance tags. + + The parsing is initiated by iterating over the parser object: + + >>> parser = HTMLParser(StringIO('
          • Foo
          ')) + >>> for kind, data, pos in parser: + ... print kind, data + START (QName(u'ul'), Attrs([(QName(u'compact'), u'compact')])) + START (QName(u'li'), Attrs()) + TEXT Foo + END li + END ul + """ + + _EMPTY_ELEMS = frozenset(['area', 'base', 'basefont', 'br', 'col', 'frame', + 'hr', 'img', 'input', 'isindex', 'link', 'meta', + 'param']) + + def __init__(self, source, filename=None, encoding='utf-8'): + """Initialize the parser for the given HTML input. + + :param source: the HTML text as a file-like object + :param filename: the name of the file, if known + :param filename: encoding of the file; ignored if the input is unicode + """ + html.HTMLParser.__init__(self) + self.source = source + self.filename = filename + self.encoding = encoding + self._queue = [] + self._open_tags = [] + + def parse(self): + """Generator that parses the HTML source, yielding markup events. + + :return: a markup event stream + :raises ParseError: if the HTML text is not well formed + """ + def _generate(): + try: + bufsize = 4 * 1024 # 4K + done = False + while 1: + while not done and len(self._queue) == 0: + data = self.source.read(bufsize) + if data == '': # end of data + self.close() + done = True + else: + self.feed(data) + for kind, data, pos in self._queue: + yield kind, data, pos + self._queue = [] + if done: + open_tags = self._open_tags + open_tags.reverse() + for tag in open_tags: + yield END, QName(tag), pos + break + except html.HTMLParseError, e: + msg = '%s: line %d, column %d' % (e.msg, e.lineno, e.offset) + raise ParseError(msg, self.filename, e.lineno, e.offset) + return Stream(_generate()).filter(_coalesce) + + def __iter__(self): + return iter(self.parse()) + + def _enqueue(self, kind, data, pos=None): + if pos is None: + pos = self._getpos() + self._queue.append((kind, data, pos)) + + def _getpos(self): + lineno, column = self.getpos() + return (self.filename, lineno, column) + + def handle_starttag(self, tag, attrib): + fixed_attrib = [] + for name, value in attrib: # Fixup minimized attributes + if value is None: + value = unicode(name) + elif not isinstance(value, unicode): + value = value.decode(self.encoding, 'replace') + fixed_attrib.append((QName(name), stripentities(value))) + + self._enqueue(START, (QName(tag), Attrs(fixed_attrib))) + if tag in self._EMPTY_ELEMS: + self._enqueue(END, QName(tag)) + else: + self._open_tags.append(tag) + + def handle_endtag(self, tag): + if tag not in self._EMPTY_ELEMS: + while self._open_tags: + open_tag = self._open_tags.pop() + self._enqueue(END, QName(open_tag)) + if open_tag.lower() == tag.lower(): + break + + def handle_data(self, text): + if not isinstance(text, unicode): + text = text.decode(self.encoding, 'replace') + self._enqueue(TEXT, text) + + def handle_charref(self, name): + if name.lower().startswith('x'): + text = unichr(int(name[1:], 16)) + else: + text = unichr(int(name)) + self._enqueue(TEXT, text) + + def handle_entityref(self, name): + try: + text = unichr(htmlentitydefs.name2codepoint[name]) + except KeyError: + text = '&%s;' % name + self._enqueue(TEXT, text) + + def handle_pi(self, data): + target, data = data.split(None, 1) + if data.endswith('?'): + data = data[:-1] + self._enqueue(PI, (target.strip(), data.strip())) + + def handle_comment(self, text): + self._enqueue(COMMENT, text) + + +def HTML(text, encoding='utf-8'): + """Parse the given HTML source and return a markup stream. + + Unlike with `HTMLParser`, the returned stream is reusable, meaning it can be + iterated over multiple times: + + >>> html = HTML('

          Foo

          ') + >>> print html +

          Foo

          + >>> print html.select('h1') +

          Foo

          + >>> print html.select('h1/text()') + Foo + + :param text: the HTML source + :return: the parsed XML event stream + :raises ParseError: if the HTML text is not well-formed, and error recovery + fails + """ + return Stream(list(HTMLParser(StringIO(text), encoding=encoding))) + +def _coalesce(stream): + """Coalesces adjacent TEXT events into a single event.""" + textbuf = [] + textpos = None + for kind, data, pos in chain(stream, [(None, None, None)]): + if kind is TEXT: + textbuf.append(data) + if textpos is None: + textpos = pos + else: + if textbuf: + yield TEXT, u''.join(textbuf), textpos + del textbuf[:] + textpos = None + if kind: + yield kind, data, pos diff --git a/src/calibre/utils/genshi/output.py b/src/calibre/utils/genshi/output.py new file mode 100644 index 0000000000..d07d3f72b0 --- /dev/null +++ b/src/calibre/utils/genshi/output.py @@ -0,0 +1,765 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""This module provides different kinds of serialization methods for XML event +streams. +""" + +from itertools import chain +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset +import re + +from calibre.utils.genshi.core import escape, Attrs, Markup, Namespace, QName, StreamEventKind +from calibre.utils.genshi.core import START, END, TEXT, XML_DECL, DOCTYPE, START_NS, END_NS, \ + START_CDATA, END_CDATA, PI, COMMENT, XML_NAMESPACE + +__all__ = ['encode', 'get_serializer', 'DocType', 'XMLSerializer', + 'XHTMLSerializer', 'HTMLSerializer', 'TextSerializer'] +__docformat__ = 'restructuredtext en' + +def encode(iterator, method='xml', encoding='utf-8', out=None): + """Encode serializer output into a string. + + :param iterator: the iterator returned from serializing a stream (basically + any iterator that yields unicode objects) + :param method: the serialization method; determines how characters not + representable in the specified encoding are treated + :param encoding: how the output string should be encoded; if set to `None`, + this method returns a `unicode` object + :param out: a file-like object that the output should be written to + instead of being returned as one big string; note that if + this is a file or socket (or similar), the `encoding` must + not be `None` (that is, the output must be encoded) + :return: a `str` or `unicode` object (depending on the `encoding` + parameter), or `None` if the `out` parameter is provided + + :since: version 0.4.1 + :note: Changed in 0.5: added the `out` parameter + """ + if encoding is not None: + errors = 'replace' + if method != 'text' and not isinstance(method, TextSerializer): + errors = 'xmlcharrefreplace' + _encode = lambda string: string.encode(encoding, errors) + else: + _encode = lambda string: string + if out is None: + return _encode(u''.join(list(iterator))) + for chunk in iterator: + out.write(_encode(chunk)) + +def get_serializer(method='xml', **kwargs): + """Return a serializer object for the given method. + + :param method: the serialization method; can be either "xml", "xhtml", + "html", "text", or a custom serializer class + + Any additional keyword arguments are passed to the serializer, and thus + depend on the `method` parameter value. + + :see: `XMLSerializer`, `XHTMLSerializer`, `HTMLSerializer`, `TextSerializer` + :since: version 0.4.1 + """ + if isinstance(method, basestring): + method = {'xml': XMLSerializer, + 'xhtml': XHTMLSerializer, + 'html': HTMLSerializer, + 'text': TextSerializer}[method.lower()] + return method(**kwargs) + + +class DocType(object): + """Defines a number of commonly used DOCTYPE declarations as constants.""" + + HTML_STRICT = ( + 'html', '-//W3C//DTD HTML 4.01//EN', + 'http://www.w3.org/TR/html4/strict.dtd' + ) + HTML_TRANSITIONAL = ( + 'html', '-//W3C//DTD HTML 4.01 Transitional//EN', + 'http://www.w3.org/TR/html4/loose.dtd' + ) + HTML_FRAMESET = ( + 'html', '-//W3C//DTD HTML 4.01 Frameset//EN', + 'http://www.w3.org/TR/html4/frameset.dtd' + ) + HTML = HTML_STRICT + + HTML5 = ('html', None, None) + + XHTML_STRICT = ( + 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' + ) + XHTML_TRANSITIONAL = ( + 'html', '-//W3C//DTD XHTML 1.0 Transitional//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + ) + XHTML_FRAMESET = ( + 'html', '-//W3C//DTD XHTML 1.0 Frameset//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd' + ) + XHTML = XHTML_STRICT + + XHTML11 = ( + 'html', '-//W3C//DTD XHTML 1.1//EN', + 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' + ) + + SVG_FULL = ( + 'svg', '-//W3C//DTD SVG 1.1//EN', + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' + ) + SVG_BASIC = ( + 'svg', '-//W3C//DTD SVG Basic 1.1//EN', + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd' + ) + SVG_TINY = ( + 'svg', '-//W3C//DTD SVG Tiny 1.1//EN', + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd' + ) + SVG = SVG_FULL + + def get(cls, name): + """Return the ``(name, pubid, sysid)`` tuple of the ``DOCTYPE`` + declaration for the specified name. + + The following names are recognized in this version: + * "html" or "html-strict" for the HTML 4.01 strict DTD + * "html-transitional" for the HTML 4.01 transitional DTD + * "html-frameset" for the HTML 4.01 frameset DTD + * "html5" for the ``DOCTYPE`` proposed for HTML5 + * "xhtml" or "xhtml-strict" for the XHTML 1.0 strict DTD + * "xhtml-transitional" for the XHTML 1.0 transitional DTD + * "xhtml-frameset" for the XHTML 1.0 frameset DTD + * "xhtml11" for the XHTML 1.1 DTD + * "svg" or "svg-full" for the SVG 1.1 DTD + * "svg-basic" for the SVG Basic 1.1 DTD + * "svg-tiny" for the SVG Tiny 1.1 DTD + + :param name: the name of the ``DOCTYPE`` + :return: the ``(name, pubid, sysid)`` tuple for the requested + ``DOCTYPE``, or ``None`` if the name is not recognized + :since: version 0.4.1 + """ + return { + 'html': cls.HTML, 'html-strict': cls.HTML_STRICT, + 'html-transitional': DocType.HTML_TRANSITIONAL, + 'html-frameset': DocType.HTML_FRAMESET, + 'html5': cls.HTML5, + 'xhtml': cls.XHTML, 'xhtml-strict': cls.XHTML_STRICT, + 'xhtml-transitional': cls.XHTML_TRANSITIONAL, + 'xhtml-frameset': cls.XHTML_FRAMESET, + 'xhtml11': cls.XHTML11, + 'svg': cls.SVG, 'svg-full': cls.SVG_FULL, + 'svg-basic': cls.SVG_BASIC, + 'svg-tiny': cls.SVG_TINY + }.get(name.lower()) + get = classmethod(get) + + +class XMLSerializer(object): + """Produces XML text from an event stream. + + >>> from genshi.builder import tag + >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) + >>> print ''.join(XMLSerializer()(elem.generate())) +


          + """ + + _PRESERVE_SPACE = frozenset() + + def __init__(self, doctype=None, strip_whitespace=True, + namespace_prefixes=None): + """Initialize the XML serializer. + + :param doctype: a ``(name, pubid, sysid)`` tuple that represents the + DOCTYPE declaration that should be included at the top + of the generated output, or the name of a DOCTYPE as + defined in `DocType.get` + :param strip_whitespace: whether extraneous whitespace should be + stripped from the output + :note: Changed in 0.4.2: The `doctype` parameter can now be a string. + """ + self.filters = [EmptyTagFilter()] + if strip_whitespace: + self.filters.append(WhitespaceFilter(self._PRESERVE_SPACE)) + self.filters.append(NamespaceFlattener(prefixes=namespace_prefixes)) + if doctype: + self.filters.append(DocTypeInserter(doctype)) + + def __call__(self, stream): + have_decl = have_doctype = False + in_cdata = False + + for filter_ in self.filters: + stream = filter_(stream) + for kind, data, pos in stream: + + if kind is START or kind is EMPTY: + tag, attrib = data + buf = ['<', tag] + for attr, value in attrib: + buf += [' ', attr, '="', escape(value), '"'] + buf.append(kind is EMPTY and '/>' or '>') + yield Markup(u''.join(buf)) + + elif kind is END: + yield Markup('' % data) + + elif kind is TEXT: + if in_cdata: + yield data + else: + yield escape(data, quotes=False) + + elif kind is COMMENT: + yield Markup('' % data) + + elif kind is XML_DECL and not have_decl: + version, encoding, standalone = data + buf = ['\n') + yield Markup(u''.join(buf)) + have_decl = True + + elif kind is DOCTYPE and not have_doctype: + name, pubid, sysid = data + buf = ['\n') + yield Markup(u''.join(buf)) % filter(None, data) + have_doctype = True + + elif kind is START_CDATA: + yield Markup('') + in_cdata = False + + elif kind is PI: + yield Markup('' % data) + + +class XHTMLSerializer(XMLSerializer): + """Produces XHTML text from an event stream. + + >>> from genshi.builder import tag + >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) + >>> print ''.join(XHTMLSerializer()(elem.generate())) +


          + """ + + _EMPTY_ELEMS = frozenset(['area', 'base', 'basefont', 'br', 'col', 'frame', + 'hr', 'img', 'input', 'isindex', 'link', 'meta', + 'param']) + _BOOLEAN_ATTRS = frozenset(['selected', 'checked', 'compact', 'declare', + 'defer', 'disabled', 'ismap', 'multiple', + 'nohref', 'noresize', 'noshade', 'nowrap']) + _PRESERVE_SPACE = frozenset([ + QName('pre'), QName('http://www.w3.org/1999/xhtml}pre'), + QName('textarea'), QName('http://www.w3.org/1999/xhtml}textarea') + ]) + + def __init__(self, doctype=None, strip_whitespace=True, + namespace_prefixes=None, drop_xml_decl=True): + super(XHTMLSerializer, self).__init__(doctype, False) + self.filters = [EmptyTagFilter()] + if strip_whitespace: + self.filters.append(WhitespaceFilter(self._PRESERVE_SPACE)) + namespace_prefixes = namespace_prefixes or {} + namespace_prefixes['http://www.w3.org/1999/xhtml'] = '' + self.filters.append(NamespaceFlattener(prefixes=namespace_prefixes)) + if doctype: + self.filters.append(DocTypeInserter(doctype)) + self.drop_xml_decl = drop_xml_decl + + def __call__(self, stream): + boolean_attrs = self._BOOLEAN_ATTRS + empty_elems = self._EMPTY_ELEMS + drop_xml_decl = self.drop_xml_decl + have_decl = have_doctype = False + in_cdata = False + + for filter_ in self.filters: + stream = filter_(stream) + for kind, data, pos in stream: + + if kind is START or kind is EMPTY: + tag, attrib = data + buf = ['<', tag] + for attr, value in attrib: + if attr in boolean_attrs: + value = attr + elif attr == u'xml:lang' and u'lang' not in attrib: + buf += [' lang="', escape(value), '"'] + elif attr == u'xml:space': + continue + buf += [' ', attr, '="', escape(value), '"'] + if kind is EMPTY: + if tag in empty_elems: + buf.append(' />') + else: + buf.append('>' % tag) + else: + buf.append('>') + yield Markup(u''.join(buf)) + + elif kind is END: + yield Markup('' % data) + + elif kind is TEXT: + if in_cdata: + yield data + else: + yield escape(data, quotes=False) + + elif kind is COMMENT: + yield Markup('' % data) + + elif kind is DOCTYPE and not have_doctype: + name, pubid, sysid = data + buf = ['\n') + yield Markup(u''.join(buf)) % filter(None, data) + have_doctype = True + + elif kind is XML_DECL and not have_decl and not drop_xml_decl: + version, encoding, standalone = data + buf = ['\n') + yield Markup(u''.join(buf)) + have_decl = True + + elif kind is START_CDATA: + yield Markup('') + in_cdata = False + + elif kind is PI: + yield Markup('' % data) + + +class HTMLSerializer(XHTMLSerializer): + """Produces HTML text from an event stream. + + >>> from genshi.builder import tag + >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) + >>> print ''.join(HTMLSerializer()(elem.generate())) +


          + """ + + _NOESCAPE_ELEMS = frozenset([ + QName('script'), QName('http://www.w3.org/1999/xhtml}script'), + QName('style'), QName('http://www.w3.org/1999/xhtml}style') + ]) + + def __init__(self, doctype=None, strip_whitespace=True): + """Initialize the HTML serializer. + + :param doctype: a ``(name, pubid, sysid)`` tuple that represents the + DOCTYPE declaration that should be included at the top + of the generated output + :param strip_whitespace: whether extraneous whitespace should be + stripped from the output + """ + super(HTMLSerializer, self).__init__(doctype, False) + self.filters = [EmptyTagFilter()] + if strip_whitespace: + self.filters.append(WhitespaceFilter(self._PRESERVE_SPACE, + self._NOESCAPE_ELEMS)) + self.filters.append(NamespaceFlattener(prefixes={ + 'http://www.w3.org/1999/xhtml': '' + })) + if doctype: + self.filters.append(DocTypeInserter(doctype)) + + def __call__(self, stream): + boolean_attrs = self._BOOLEAN_ATTRS + empty_elems = self._EMPTY_ELEMS + noescape_elems = self._NOESCAPE_ELEMS + have_doctype = False + noescape = False + + for filter_ in self.filters: + stream = filter_(stream) + for kind, data, pos in stream: + + if kind is START or kind is EMPTY: + tag, attrib = data + buf = ['<', tag] + for attr, value in attrib: + if attr in boolean_attrs: + if value: + buf += [' ', attr] + elif ':' in attr: + if attr == 'xml:lang' and u'lang' not in attrib: + buf += [' lang="', escape(value), '"'] + elif attr != 'xmlns': + buf += [' ', attr, '="', escape(value), '"'] + buf.append('>') + if kind is EMPTY: + if tag not in empty_elems: + buf.append('' % tag) + yield Markup(u''.join(buf)) + if tag in noescape_elems: + noescape = True + + elif kind is END: + yield Markup('' % data) + noescape = False + + elif kind is TEXT: + if noescape: + yield data + else: + yield escape(data, quotes=False) + + elif kind is COMMENT: + yield Markup('' % data) + + elif kind is DOCTYPE and not have_doctype: + name, pubid, sysid = data + buf = ['\n') + yield Markup(u''.join(buf)) % filter(None, data) + have_doctype = True + + elif kind is PI: + yield Markup('' % data) + + +class TextSerializer(object): + """Produces plain text from an event stream. + + Only text events are included in the output. Unlike the other serializer, + special XML characters are not escaped: + + >>> from genshi.builder import tag + >>> elem = tag.div(tag.a('', href='foo'), tag.br) + >>> print elem + + >>> print ''.join(TextSerializer()(elem.generate())) + + + If text events contain literal markup (instances of the `Markup` class), + that markup is by default passed through unchanged: + + >>> elem = tag.div(Markup('Hello & Bye!
          ')) + >>> print elem.generate().render(TextSerializer) + Hello & Bye!
          + + You can use the ``strip_markup`` to change this behavior, so that tags and + entities are stripped from the output (or in the case of entities, + replaced with the equivalent character): + + >>> print elem.generate().render(TextSerializer, strip_markup=True) + Hello & Bye! + """ + + def __init__(self, strip_markup=False): + """Create the serializer. + + :param strip_markup: whether markup (tags and encoded characters) found + in the text should be removed + """ + self.strip_markup = strip_markup + + def __call__(self, stream): + strip_markup = self.strip_markup + for event in stream: + if event[0] is TEXT: + data = event[1] + if strip_markup and type(data) is Markup: + data = data.striptags().stripentities() + yield unicode(data) + + +class EmptyTagFilter(object): + """Combines `START` and `STOP` events into `EMPTY` events for elements that + have no contents. + """ + + EMPTY = StreamEventKind('EMPTY') + + def __call__(self, stream): + prev = (None, None, None) + for ev in stream: + if prev[0] is START: + if ev[0] is END: + prev = EMPTY, prev[1], prev[2] + yield prev + continue + else: + yield prev + if ev[0] is not START: + yield ev + prev = ev + + +EMPTY = EmptyTagFilter.EMPTY + + +class NamespaceFlattener(object): + r"""Output stream filter that removes namespace information from the stream, + instead adding namespace attributes and prefixes as needed. + + :param prefixes: optional mapping of namespace URIs to prefixes + + >>> from genshi.input import XML + >>> xml = XML(''' + ... + ... ''') + >>> for kind, data, pos in NamespaceFlattener()(xml): + ... print kind, repr(data) + START (u'doc', Attrs([(u'xmlns', u'NS1'), (u'xmlns:two', u'NS2')])) + TEXT u'\n ' + START (u'two:item', Attrs()) + END u'two:item' + TEXT u'\n' + END u'doc' + """ + + def __init__(self, prefixes=None): + self.prefixes = {XML_NAMESPACE.uri: 'xml'} + if prefixes is not None: + self.prefixes.update(prefixes) + + def __call__(self, stream): + prefixes = dict([(v, [k]) for k, v in self.prefixes.items()]) + namespaces = {XML_NAMESPACE.uri: ['xml']} + def _push_ns(prefix, uri): + namespaces.setdefault(uri, []).append(prefix) + prefixes.setdefault(prefix, []).append(uri) + + ns_attrs = [] + _push_ns_attr = ns_attrs.append + def _make_ns_attr(prefix, uri): + return u'xmlns%s' % (prefix and ':%s' % prefix or ''), uri + + def _gen_prefix(): + val = 0 + while 1: + val += 1 + yield 'ns%d' % val + _gen_prefix = _gen_prefix().next + + for kind, data, pos in stream: + + if kind is START or kind is EMPTY: + tag, attrs = data + + tagname = tag.localname + tagns = tag.namespace + if tagns: + if tagns in namespaces: + prefix = namespaces[tagns][-1] + if prefix: + tagname = u'%s:%s' % (prefix, tagname) + else: + _push_ns_attr((u'xmlns', tagns)) + _push_ns('', tagns) + + new_attrs = [] + for attr, value in attrs: + attrname = attr.localname + attrns = attr.namespace + if attrns: + if attrns not in namespaces: + prefix = _gen_prefix() + _push_ns(prefix, attrns) + _push_ns_attr(('xmlns:%s' % prefix, attrns)) + else: + prefix = namespaces[attrns][-1] + if prefix: + attrname = u'%s:%s' % (prefix, attrname) + new_attrs.append((attrname, value)) + + yield kind, (tagname, Attrs(ns_attrs + new_attrs)), pos + del ns_attrs[:] + + elif kind is END: + tagname = data.localname + tagns = data.namespace + if tagns: + prefix = namespaces[tagns][-1] + if prefix: + tagname = u'%s:%s' % (prefix, tagname) + yield kind, tagname, pos + + elif kind is START_NS: + prefix, uri = data + if uri not in namespaces: + prefix = prefixes.get(uri, [prefix])[-1] + _push_ns_attr(_make_ns_attr(prefix, uri)) + _push_ns(prefix, uri) + + elif kind is END_NS: + if data in prefixes: + uris = prefixes.get(data) + uri = uris.pop() + if not uris: + del prefixes[data] + if uri not in uris or uri != uris[-1]: + uri_prefixes = namespaces[uri] + uri_prefixes.pop() + if not uri_prefixes: + del namespaces[uri] + if ns_attrs: + attr = _make_ns_attr(data, uri) + if attr in ns_attrs: + ns_attrs.remove(attr) + + else: + yield kind, data, pos + + +class WhitespaceFilter(object): + """A filter that removes extraneous ignorable white space from the + stream. + """ + + def __init__(self, preserve=None, noescape=None): + """Initialize the filter. + + :param preserve: a set or sequence of tag names for which white-space + should be preserved + :param noescape: a set or sequence of tag names for which text content + should not be escaped + + The `noescape` set is expected to refer to elements that cannot contain + further child elements (such as ``\n" +"

          " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 msgid "Edit Meta information" @@ -2814,10 +2842,13 @@ msgid "" "Redirect console output to a dialog window (both stdout and stderr). Useful " "on windows where GUI apps do not have a output streams." msgstr "" +"Redireccionar salida de consola hacia una ventana de diálogo (ambas stdout " +"and stderr). Útil en windows, donde las aplicacines en GUI no tienen cadenas " +"de salida." #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 msgid "ERROR: Unhandled exception" -msgstr "" +msgstr "ERROR: Excepción no Contemplada" #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" @@ -2927,6 +2958,10 @@ msgid "" "Available fields: %s\n" "Default: %%default" msgstr "" +"Campos a mostrar cuando se listan libros de la Base de Datos. Tienen que " +"estar separados por comas.\n" +"Campos disponibles: %s\n" +"Defecto: %%default" #: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" @@ -2934,6 +2969,9 @@ msgid "" "Available fields: %s\n" "Default: %%default" msgstr "" +"Campos por los que ordenar el resultado.\n" +"Campos disponibles: %s\n" +"Defecto: %%default" #: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" @@ -3070,10 +3108,15 @@ msgid "" "id. \n" "id is an id number from the list command. \n" msgstr "" +"\n" +"%prog show_metadata [options] id\n" +"Muestra los metadatos almacenados en la Base de Datos de calibre para el " +"libro identificado por ID.\n" +"Id es un número de identificador de la lista de comandos. \n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:328 msgid "Print metadata in OPF form (XML)" -msgstr "" +msgstr "Imprimir metadatos en formato OPF (XML)" #: /home/kovid/work/calibre/src/calibre/library/cli.py:333 msgid "You must specify an id" @@ -3366,7 +3409,8 @@ msgid "" "%s" msgstr "" "\n" -"Artículo %s descargado desde %s" +"Artículo %s descargado desde %s\n" +"%s" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 msgid "Article downloaded: %s" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index afeef93a54..3c9a04be89 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 48cd3767cf..408988bb55 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/nds.po b/src/calibre/translations/nds.po index b98a5ffddb..de93a7e477 100644 --- a/src/calibre/translations/nds.po +++ b/src/calibre/translations/nds.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index 6b70b21f02..b227098c18 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-06-23 07:18+0000\n" -"PO-Revision-Date: 2008-06-02 08:40+0000\n" +"PO-Revision-Date: 2008-06-29 05:48+0000\n" "Last-Translator: Marc van den Dikkenberg \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -95,7 +95,7 @@ msgstr "Gemaakt door " #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 msgid "Unable to detect the %s disk drive. Try rebooting." -msgstr "" +msgstr "Schijf %s is niet gevonden. Probeer te herstarten." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 msgid "Set the title. Default: filename." @@ -275,12 +275,16 @@ msgid "" "Render tables in the HTML as images (useful if the document has large or " "complex tables)" msgstr "" +"Genereer HTML tabellen als afbeeldingen. (Handig als het document grote of " +"gecompliceerde tabellen bevat)" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 msgid "" "Multiply the size of text in rendered tables by this factor. Default is " "%default" msgstr "" +"Vermenigvuldig de tekst grootte in gegenereerde tabellen bij deze waarde. " +"Standaard is %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" @@ -306,7 +310,7 @@ msgstr "Voeg geen links toe aan de inhoudsopgave." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 msgid "Prevent the automatic detection chapters." -msgstr "" +msgstr "Vind niet automatisch nieuwe hoofdstukken." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" @@ -323,6 +327,11 @@ msgid "" "regexp. For example to match all heading tags that have the attribute " "class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" msgstr "" +"vind het begin van een hoofdstuk bij een element met het gespecificeerde " +"attribuut. Het formaat voor deze optie is tagnaam regexp, attribuut naam, " +"attribuut waarde regexp. Bijvoorbeeld, om alle kop tags te vinden met de " +"attribuut klasse \"hoofstuk\", gebruik \"h\\d\\klasse,hoofdstuk\". Standaard " +"is %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" @@ -390,6 +399,11 @@ msgid "" "slower page turns. For example: --serif-family \"Times New Roman\"\n" " " msgstr "" +"Specificeer truetype font families voor serif, sans-serif en monospace " +"lettertypen. Deze fonts zullen worden bijgesloten in het LRF bestand. Het " +"gebruik van niet-standaard lettertypen leidt tot langzamere pagina " +"wisselingen. Bijvoorbeeld: --serif-famiy \"Times New Roman\"\n" +" " #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" @@ -1148,7 +1162,7 @@ msgstr "Een geldige toegangssleutel is nodig voor isbndb.com" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 msgid "Error fetching metadata" -msgstr "" +msgstr "Fout bij ophalen metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" @@ -1179,7 +1193,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 msgid "&Access Key:" -msgstr "" +msgstr "&Toegangs Sleutel:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1206,7 +1220,7 @@ msgstr "Niet beschikbaar" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 msgid " - Jobs" -msgstr "" +msgstr " - Taken" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" @@ -1564,10 +1578,12 @@ msgstr "&Onder Marge:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 msgid "&Convert tables to images (good for large/complex tables)" msgstr "" +"&Converteer tabellen naar afbeeldingen (Goed voor grote/gecompliceerde " +"tabellen)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 msgid "&Multiplier for text size in rendered tables:" -msgstr "" +msgstr "&Multiplier van tekst grootte in gegenereerde tabellen:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" @@ -1607,7 +1623,7 @@ msgstr "Forceer nieuwe pagina voor &attribuut:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 msgid "Detect chapter &at tag:" -msgstr "" +msgstr "Detecteer hoofdstuk bij t&ag:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" @@ -1626,6 +1642,16 @@ msgid "" "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\">

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

          " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 msgid "Edit Meta information" @@ -1899,7 +1925,7 @@ msgstr "Het bijgevoegde bestand: %s is een recept om %s te downloaden." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:70 msgid "Recipe for " -msgstr "" +msgstr "Recept voor " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 @@ -2156,7 +2182,7 @@ msgstr "Reguliere expressie groep naam (?)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 msgid "ISBN:" -msgstr "" +msgstr "ISBN:" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" @@ -2420,7 +2446,7 @@ msgstr "Apparaat: " #: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " -msgstr "" +msgstr "Verbonden " #: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" @@ -2613,7 +2639,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" -msgstr "" +msgstr "Converteer Fout" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" @@ -2641,10 +2667,13 @@ msgid "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features. " "Visit the download page?" msgstr "" +"%s is geupdate naar versie %s. Zie die nieuwe functies " +"Bezoek download pagina?" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" -msgstr "" +msgstr "Update beschikbaar" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" @@ -2713,7 +2742,7 @@ msgstr "Zend naar lezer" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" -msgstr "" +msgstr "S" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" @@ -2721,7 +2750,7 @@ msgstr "Download niews" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" -msgstr "" +msgstr "F" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" @@ -2729,21 +2758,23 @@ msgstr "Converteer E-boeken" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" -msgstr "" +msgstr "C" #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" -msgstr "" +msgstr "V" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 msgid "" "Redirect console output to a dialog window (both stdout and stderr). Useful " "on windows where GUI apps do not have a output streams." msgstr "" +"Verwijs console output naar een dialoog venster (zowel stdout als stderr). " +"Handig onder Windows waar GUI applicatie geen output stream hebben." #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 msgid "ERROR: Unhandled exception" -msgstr "" +msgstr "FOUT: Niet-verwerkte uitzondering" #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" @@ -3006,14 +3037,20 @@ msgid "" "id. \n" "id is an id number from the list command. \n" msgstr "" +"\n" +"%prog show_metadata [opties] id\n" +"\n" +"Laat de metadata uit de Calibre database zien voor het boek geidentificeerd " +"met het id. \n" +"id is een id nummer van het list commando \n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:328 msgid "Print metadata in OPF form (XML)" -msgstr "" +msgstr "Print metadata in OPF formaat (XML)" #: /home/kovid/work/calibre/src/calibre/library/cli.py:333 msgid "You must specify an id" -msgstr "" +msgstr "Je moet een id opgeven" #: /home/kovid/work/calibre/src/calibre/library/cli.py:347 msgid "" @@ -3027,10 +3064,19 @@ msgid "" "can get a quick feel for the OPF format by using the --as-opf switch to the\n" "show_metadata command.\n" msgstr "" +"\n" +"%prog set_metadata [opties] id /pad/naar/metadata.opf\n" +"\n" +"Definieer de metadata die is opgeslagen in de Calibre database voor het " +"boek\n" +"geidenticeerd met id uit het OPF bestand metadata.opf. id is een id nummer " +"uit\n" +"het list commando. Je kunt meer informatie voor het OPF formaat zien door\n" +"--as-opf parameter op te geven bij het show_metadata commando.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:360 msgid "You must specify an id and a metadata file" -msgstr "" +msgstr "Je moet een id en metadata bestand opgeven" #: /home/kovid/work/calibre/src/calibre/library/cli.py:372 msgid "" @@ -3042,26 +3088,32 @@ msgid "" "(in \n" "an opf file). You can get id numbers from the list command. \n" msgstr "" +"%prog export [opties] ids \n" +"\n" +"Exporteer de boeken opgegeven als ids (een lijst gescheiden met komma's)\n" +"naar het bestandssysteem. De exporteer operatie bewaard alle formaten van\n" +"het boek, de cover en metadata (in een opf bestand) Je kunt id nummers zien\n" +"via het list commando. \n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:380 msgid "Export all books in database, ignoring the list of ids." -msgstr "" +msgstr "Exporteer alle boeken in de database, negeer de lijst met ids." #: /home/kovid/work/calibre/src/calibre/library/cli.py:382 msgid "Export books to the specified directory. Default is" -msgstr "" +msgstr "Exporteer boeken naar de opgegeven folder. Standaard is" #: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "Export all books into a single directory" -msgstr "" +msgstr "exporteer alle boeken naar een enkele folder" #: /home/kovid/work/calibre/src/calibre/library/cli.py:386 msgid "Create file names as author - title instead of title - author" -msgstr "" +msgstr "Maak bestands namen als auteur - titel in plaats van titel - auteur" #: /home/kovid/work/calibre/src/calibre/library/cli.py:391 msgid "You must specify some ids or the %s option" -msgstr "" +msgstr "Je moet ids opgeven of de %s optie gebruiken" #: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" @@ -3083,11 +3135,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/parallel.py:317 msgid "Could not launch worker process." -msgstr "" +msgstr "Werker sessie kan niet worden gestart." #: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" -msgstr "" +msgstr "De fontconfig bibliotheek kon niet worden geinitialiseerd." #: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 msgid "URL must have the scheme sftp" diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index cf98e8f7e1..665f3ecc24 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 492dd37111..db11c7cfe7 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/te.po b/src/calibre/translations/te.po index ef2a4bba73..51d7928984 100644 --- a/src/calibre/translations/te.po +++ b/src/calibre/translations/te.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-28 07:16+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/__init__.py:99 From a6bc35639ca1509eb76d930ede4bb3c225d9a0b9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 29 Jun 2008 10:15:55 -0700 Subject: [PATCH 41/54] version 0.4.74 --- src/calibre/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index b4e347a9af..225bf41017 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.73' +__version__ = '0.4.74' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' From dcdd12bb5046dd0207f50259c5927e07f21721ed Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 29 Jun 2008 10:53:05 -0700 Subject: [PATCH 42/54] IGN:Tag release --- src/calibre/manual/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py index c4d45ffce2..a617b5a9af 100644 --- a/src/calibre/manual/custom.py +++ b/src/calibre/manual/custom.py @@ -10,7 +10,7 @@ from sphinx.ext.autodoc import get_module_charset, prepare_docstring from docutils.statemachine import ViewList from docutils import nodes -from genshi.template import TextTemplate +from genshi.template import OldTextTemplate sys.path.append(os.path.abspath('../../../')) from calibre.linux import entry_points From 3cf05b8f663d7fb2177a7ea65c649bbb8579ea7a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 11:13:01 -0700 Subject: [PATCH 43/54] Fix #833 and #834 --- src/calibre/trac/plugins/download.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py index d22efcf0f0..ed9a8483a0 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -80,9 +80,8 @@ class Distribution(object): self.command = cmd.strip() easy_install = 'easy_install' if os == 'debian': - self.command += '\n'+prefix + 'cp -R /usr/share/pycentral/fonttools/site-packages/FontTools* /usr/lib/python2.5/site-packages/' easy_install = 'easy_install-2.5' - self.command += '\n'+prefix+easy_install+' -U TTFQuery calibre \n'+prefix+'calibre_postinstall' + self.command += '\n'+prefix+easy_install+' -U calibre \n'+prefix+'calibre_postinstall' try: self.manual = Markup(self.MANUAL_MAP[os]) except KeyError: From 0b0346884f18deb468a173913b3ea42e2f4aaf69 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 11:39:09 -0700 Subject: [PATCH 44/54] Fix bug in lrf-meta that could cause corrupted LRF files when setting metadata. --- src/calibre/ebooks/lrf/meta.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/lrf/meta.py b/src/calibre/ebooks/lrf/meta.py index 9c2882dcee..80fc542c1c 100644 --- a/src/calibre/ebooks/lrf/meta.py +++ b/src/calibre/ebooks/lrf/meta.py @@ -375,7 +375,8 @@ class LRFMetaFile(object): delta = insert_into_file(self._file, stream, self.info_start, \ self.info_start + orig_size - 4) - self.toc_object_offset += delta + if self.toc_object_offset > 0: + self.toc_object_offset += delta self.object_index_offset += delta self.update_object_offsets(delta) @@ -480,7 +481,7 @@ class LRFMetaFile(object): @param args: The values to pack @param fmt: See U{struct} @param start: Position in file at which to write encoded data - """ + """ encoded = struct.pack(kwargs["fmt"], *args) self._file.seek(kwargs["start"]) self._file.write(encoded) @@ -685,3 +686,4 @@ def main(args=sys.argv): if __name__ == '__main__': sys.exit(main()) + From e74166ea0996e3d5f532e5e9a13f128cc3f44ae6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 12:05:51 -0700 Subject: [PATCH 45/54] Fix #835 --- src/calibre/ebooks/metadata/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 7807c66a86..a511d6087a 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -80,14 +80,16 @@ class Resource(object): basedir = os.getcwd() if self.path is None: return self._href - frag = '#'+quote(self.fragment) if self.fragment else '' + f = self.fragment.encode('utf-8') if isinstance(self.fragment, unicode) else self.fragment + frag = '#'+quote(f) if self.fragment else '' if self.path == basedir: return ''+frag try: rpath = relpath(self.path, basedir) except OSError: # On windows path and basedir could be on different drives rpath = self.path - + if isinstance(rpath, unicode): + rpath = rpath.encode('utf-8') return quote(rpath.replace(os.sep, '/'))+frag def set_basedir(self, path): From ff81ab5db7a71aedace08dfd66be525d6b50ce06 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 12:24:52 -0700 Subject: [PATCH 46/54] Fix regression that was causing the cover path to be incorrect in the exported OPF file when saving to disk --- src/calibre/ebooks/metadata/opf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index df84bc59da..e8075465a7 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -495,12 +495,13 @@ class OPFCreator(MetaInformation): self.manifest.set_basedir(self.base_path) if not self.guide: self.guide = Guide() - self.guide.set_basedir(self.base_path) if self.cover: cover = self.cover if not os.path.isabs(cover): cover = os.path.abspath(os.path.join(self.base_path, cover)) self.guide.set_cover(cover) + self.guide.set_basedir(self.base_path) + opf = template.generate(__appname__=__appname__, mi=self).render('xml') opf_stream.write(opf) opf_stream.flush() From 48d37fffc9385fe1ef059dffde5a2aaa04e9c084 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 13:15:50 -0700 Subject: [PATCH 47/54] version 0.4.75 --- src/calibre/__init__.py | 2 +- src/calibre/ebooks/metadata/__init__.py | 4 +++- src/calibre/library/database.py | 1 - src/calibre/manual/custom.py | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 225bf41017..d9b3b9befd 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.74' +__version__ = '0.4.75' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index a511d6087a..c661890d88 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' """ Provides abstraction for metadata reading.writing from a variety of ebook formats. """ -import os, mimetypes +import os, mimetypes, sys from urllib import unquote, quote from urlparse import urlparse @@ -55,6 +55,8 @@ class Resource(object): path = href_or_path if not os.path.isabs(path): path = os.path.abspath(os.path.join(path, basedir)) + if isinstance(path, str): + path = path.decode(sys.getfilesystemencoding()) self.path = path else: url = urlparse(href_or_path) diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index d80917108e..d3f4654969 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1421,7 +1421,6 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; name = au + ' - ' + title if byauthor else title + ' - ' + au name += '_'+id base = dir if single_dir else tpath - mi = OPFCreator(base, self.get_metadata(idx, index_is_id=index_is_id)) cover = self.cover(idx, index_is_id=index_is_id) if cover is not None: diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py index a617b5a9af..2098369fee 100644 --- a/src/calibre/manual/custom.py +++ b/src/calibre/manual/custom.py @@ -10,7 +10,7 @@ from sphinx.ext.autodoc import get_module_charset, prepare_docstring from docutils.statemachine import ViewList from docutils import nodes -from genshi.template import OldTextTemplate +from genshi.template import OldTextTemplate as TextTemplate sys.path.append(os.path.abspath('../../../')) from calibre.linux import entry_points From 11c561e6f7f5e12517d89460e652374830ed64c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 13:17:41 -0700 Subject: [PATCH 48/54] IGN:Tag release From ffc6d51e1d6132d17f9c3616489461cd6fb73991 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 13:48:28 -0700 Subject: [PATCH 49/54] Properly handle non ascii quoted URLs in OPF files --- src/calibre/ebooks/metadata/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index c661890d88..e4fb42cc95 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -63,7 +63,11 @@ class Resource(object): if url[0] not in ('', 'file'): self._href = href_or_path else: - self.path = os.path.abspath(os.path.join(basedir, unquote(url[2]).replace('/', os.sep))) + pc = url[2] + if isinstance(pc, unicode): + pc.encode('utf-8') + pc = unquote(pc).decode('utf-8') + self.path = os.path.abspath(os.path.join(basedir, pc.replace('/', os.sep))) self.fragment = unquote(url[-1]) From 09b8ba77d23acb1a1af52cfcafae0d9b51402a24 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 14:13:15 -0700 Subject: [PATCH 50/54] Fix #836 --- src/calibre/gui2/dialogs/metadata_bulk.py | 17 ++++++--- src/calibre/gui2/dialogs/metadata_bulk.ui | 44 +++++++++++++---------- src/calibre/gui2/dialogs/tag_editor.py | 7 ++-- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 0cd7fc3a78..99175b656b 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -8,6 +8,7 @@ from PyQt4.QtGui import QDialog from calibre.gui2 import qstring_to_unicode from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog +from calibre.gui2.dialogs.tag_editor import TagEditor class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def __init__(self, window, rows, db): @@ -20,8 +21,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.write_rating = False self.changed = False QObject.connect(self.button_box, SIGNAL("accepted()"), self.sync) - QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.series_changed) - QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.series_changed) QObject.connect(self.rating, SIGNAL('valueChanged(int)'), self.rating_changed) all_series = self.db.all_series() @@ -31,9 +30,17 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series.addItem(name) self.series.lineEdit().setText('') - + QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.series_changed) + QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.series_changed) + QObject.connect(self.tag_editor_button, SIGNAL('clicked()'), self.tag_editor) self.exec_() - + + def tag_editor(self): + d = TagEditor(self, self.db, None) + d.exec_() + if d.result() == QDialog.Accepted: + tag_string = ', '.join(d.tags) + self.tags.setText(tag_string) def sync(self): for id in self.ids: @@ -51,7 +58,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.db.set_publisher(id, pub) tags = qstring_to_unicode(self.tags.text()).strip() if tags: - tags = tags.split(',') + tags = map(lambda x: x.strip(), tags.split(',')) self.db.set_tags(id, tags, append=True) remove_tags = qstring_to_unicode(self.remove_tags.text()).strip() if remove_tags: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index a93df2be76..1b7929cdc6 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -13,9 +13,10 @@ Edit Meta information - :/images/edit_input.svg + + :/images/edit_input.svg:/images/edit_input.svg - + @@ -26,16 +27,7 @@ 6 - - 0 - - - 0 - - - 0 - - + 0 @@ -43,7 +35,7 @@ Meta information - + @@ -57,7 +49,7 @@ - + Change the author(s) of this book. Multiple authors should be separated by a comma @@ -77,7 +69,7 @@ - + Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles. @@ -94,7 +86,7 @@ - + Rating of this book. 0-5 stars @@ -126,7 +118,7 @@ - + Change the publisher of this book @@ -153,6 +145,20 @@ + + + + Open Tag Editor + + + Open Tag Editor + + + + :/images/chapters.svg:/images/chapters.svg + + + @@ -163,7 +169,7 @@ - + Comma separated list of tags to remove from the books. @@ -218,7 +224,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/calibre/gui2/dialogs/tag_editor.py b/src/calibre/gui2/dialogs/tag_editor.py index 8185d1e40a..68eca39c3e 100644 --- a/src/calibre/gui2/dialogs/tag_editor.py +++ b/src/calibre/gui2/dialogs/tag_editor.py @@ -9,14 +9,17 @@ from calibre.gui2 import question_dialog, error_dialog class TagEditor(QDialog, Ui_TagEditor): - def __init__(self, window, db, index): + def __init__(self, window, db, index=None): QDialog.__init__(self, window) Ui_TagEditor.__init__(self) self.setupUi(self) self.db = db self.index = index - tags = self.db.tags(self.index) + if self.index is not None: + tags = self.db.tags(self.index) + else: + tags = [] if tags: tags = [tag.lower().strip() for tag in tags.split(',') if tag.strip()] tags.sort() From 50cb9db06eb90a43c3b83a9221d53d88ef16fcf9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 15:07:37 -0700 Subject: [PATCH 51/54] Implement #837 --- src/calibre/devices/prs505/driver.py | 2 ++ src/calibre/gui2/library.py | 2 +- src/calibre/gui2/main.py | 37 ++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 4f2e98b4f7..bbfbdf037c 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -351,6 +351,8 @@ class PRS505(Device): os.utime(path, None) def upload_books(self, files, names, on_card=False, end_session=True): + if on_card and not self._card_prefix: + raise ValueError(_('The reader has no storage card connected.')) path = os.path.join(self._card_prefix, self.CARD_PATH_PREFIX) if on_card \ else os.path.join(self._main_prefix, 'database', 'media', 'books') diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index d03716b54c..70f92e2805 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -335,7 +335,7 @@ class BooksModel(QAbstractTableModel): return ans def id(self, row): - return self.db.id(row.row()) + return self.db.id(getattr(row, 'row', lambda:row)()) def title(self, row_number): return self.db.title(row_number) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 4303b376e9..e6f0df58e6 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -113,6 +113,19 @@ class Main(MainWindow, Ui_MainWindow): sm = QMenu() sm.addAction(QIcon(':/images/reader.svg'), _('Send to main memory')) sm.addAction(QIcon(':/images/sd.svg'), _('Send to storage card')) + sm.addAction(QIcon(':/images/reader.svg'), _('Send to main memory')+' '+_('and delete from library')) + sm.addAction(QIcon(':/images/sd.svg'), _('Send to storage card')+' '+_('and delete from library')) + sm.addSeparator() + sm.addAction(_('Send to storage card by default')) + sm.actions()[-1].setCheckable(True) + def default_sync(checked): + Settings().set('send to device by default', bool(checked)) + QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) + QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card) + QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card if checked else self.sync_to_main_memory) + QObject.connect(sm.actions()[-1], SIGNAL('toggled(bool)'), default_sync) + sm.actions()[-1].setChecked(Settings().get('send to device by default', False)) + default_sync(sm.actions()[-1].isChecked()) self.sync_menu = sm # Needed md = QMenu() md.addAction(_('Edit metadata individually')) @@ -131,9 +144,10 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.action_edit, SIGNAL("triggered(bool)"), self.edit_metadata) QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), partial(self.edit_metadata, bulk=False)) QObject.connect(md.actions()[1], SIGNAL('triggered(bool)'), self.edit_bulk_metadata) - QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) QObject.connect(sm.actions()[0], SIGNAL('triggered(bool)'), self.sync_to_main_memory) QObject.connect(sm.actions()[1], SIGNAL('triggered(bool)'), self.sync_to_card) + QObject.connect(sm.actions()[2], SIGNAL('triggered(bool)'), partial(self.sync_to_main_memory, delete_from_library=True)) + QObject.connect(sm.actions()[3], SIGNAL('triggered(bool)'), partial(self.sync_to_card, delete_from_library=True)) self.save_menu = QMenu() self.save_menu.addAction(_('Save to disk')) self.save_menu.addAction(_('Save to disk in a single directory')) @@ -242,8 +256,6 @@ class Main(MainWindow, Ui_MainWindow): self.status_bar.book_info.book_data.setMaximumHeight(1000) self.setMaximumHeight(available_height()) - - def sync_cf_to_listview(self, index, *args): if not hasattr(index, 'row') and self.library_view.currentIndex().row() != index: @@ -486,7 +498,8 @@ class Main(MainWindow, Ui_MainWindow): ''' Called once books have been uploaded. ''' - metadata, on_card = self.upload_memory.pop(id)[:2] + metadata, on_card, memory = self.upload_memory.pop(id) + if exception: if isinstance(exception, FreeSpaceError): where = 'in main memory.' if 'memory' in str(exception) else 'on the storage card.' @@ -506,6 +519,9 @@ class Main(MainWindow, Ui_MainWindow): view = self.card_view if on_card else self.memory_view view.model().resort(reset=False) view.model().research() + if memory[1]: + rows = map(self.library_view.model().db.index, memory[1]) + self.library_view.model().delete_books(rows) ############################################################################ @@ -590,11 +606,11 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################# Syncing to device############################# - def sync_to_main_memory(self, checked): - self.sync_to_device(False) + def sync_to_main_memory(self, checked, delete_from_library=False): + self.sync_to_device(False, delete_from_library) - def sync_to_card(self, checked): - self.sync_to_device(True) + def sync_to_card(self, checked, delete_from_library=False): + self.sync_to_device(True, delete_from_library) def cover_to_thumbnail(self, data): p = QPixmap() @@ -605,7 +621,7 @@ class Main(MainWindow, Ui_MainWindow): p = p.scaledToHeight(ht, Qt.SmoothTransformation) return (p.width(), p.height(), pixmap_to_data(p)) - def sync_to_device(self, on_card): + def sync_to_device(self, on_card, delete_from_library): rows = self.library_view.selectionModel().selectedRows() if not self.device_manager or not rows or len(rows) == 0: return @@ -653,7 +669,8 @@ class Main(MainWindow, Ui_MainWindow): else: prefix = prefix.decode('ascii', 'ignore').encode('ascii', 'ignore') names.append('%s_%d%s'%(prefix, id, os.path.splitext(f)[1])) - self.upload_books(gf, names, good, on_card, memory=_files) + remove = [self.library_view.model().id(r) for r in rows] if delete_from_library else [] + self.upload_books(gf, names, good, on_card, memory=(_files, remove)) self.status_bar.showMessage(_('Sending books to device.'), 5000) if bad: bad = '\n'.join('
        11. %s
        12. '%(i,) for i in bad) From 0a7aa9931e035ecace412b5b57dbe357d75ab313 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 15:12:47 -0700 Subject: [PATCH 52/54] version 0.4.76 --- src/calibre/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index d9b3b9befd..721d93dcfd 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.75' +__version__ = '0.4.76' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' From b560528b93cb3df437388bb926470909727ae72f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Jun 2008 15:14:42 -0700 Subject: [PATCH 53/54] IGN:Tag release From 75c3fa5a2307ab65962de0697916c70aa20087c7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 1 Jul 2008 12:42:30 -0700 Subject: [PATCH 54/54] Fix #838 --- src/calibre/ebooks/lrf/__init__.py | 2 -- src/calibre/ebooks/lrf/any/convert_from.py | 11 ++++++----- src/calibre/ebooks/lrf/html/convert_from.py | 8 +++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py index 1cdba123d8..6b724fd008 100644 --- a/src/calibre/ebooks/lrf/__init__.py +++ b/src/calibre/ebooks/lrf/__init__.py @@ -9,8 +9,6 @@ from optparse import OptionValueError from htmlentitydefs import name2codepoint from uuid import uuid4 -from fontTools.ttLib import TTLibError - from calibre.ebooks.lrf.pylrs.pylrs import Book as _Book from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Header, PutObj, \ Paragraph, TextStyle, BlockStyle diff --git a/src/calibre/ebooks/lrf/any/convert_from.py b/src/calibre/ebooks/lrf/any/convert_from.py index ab66fc1b89..c0a1a6500c 100644 --- a/src/calibre/ebooks/lrf/any/convert_from.py +++ b/src/calibre/ebooks/lrf/any/convert_from.py @@ -66,7 +66,7 @@ def traverse_subdirs(tdir): return tdir def handle_archive(path): - tdir = tempfile.mkdtemp(prefix=__appname__+'_') + tdir = tempfile.mkdtemp(prefix=__appname__+'_'+'archive_') extract(path, tdir) files = [] cdir = traverse_subdirs(tdir) @@ -75,9 +75,10 @@ def handle_archive(path): pat = os.path.join(cdir, '*.'+ext) files.extend(glob.glob(pat)) file = largest_file(files) - if file: - return tdir, file - file = find_htmlfile(cdir) + if not file: + file = find_htmlfile(cdir) + if isinstance(file, str): + file = file.decode(sys.getfilesystemencoding()) return tdir, file def process_file(path, options, logger=None): @@ -109,7 +110,7 @@ def process_file(path, options, logger=None): if not newpath: raise UnknownFormatError('Could not find ebook in archive') path = newpath - logger.info('Found ebook in archive: %s', path) + logger.info('Found ebook in archive: %s', repr(path)) try: ext = os.path.splitext(path)[1][1:].lower() convertor = None diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 27bf152597..15eede6d6c 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -368,9 +368,10 @@ class HTMLConverter(object, LoggingInterface): else: self.css[selector] = self.override_css[selector] - self.file_name = os.path.basename(path) - self.log_info(_('Processing %s'), path if self.verbose else self.file_name) - upath = path.encode('utf-8') if isinstance(path, unicode) else path + upath = path.encode(sys.getfilesystemencoding()) if isinstance(path, unicode) else path + self.file_name = os.path.basename(upath.decode(sys.getfilesystemencoding())) + self.log_info(_('Processing %s'), repr(upath) if self.verbose else repr(self.file_name)) + if not os.path.exists(upath): upath = upath.replace('&', '%26') #convertlit replaces & with %26 in file names f = open(upath, 'rb') @@ -1799,6 +1800,7 @@ def process_file(path, options, logger=None): level = logging.DEBUG if options.verbose else logging.INFO logger = logging.getLogger('html2lrf') setup_cli_handlers(logger, level) + if not isinstance(path, unicode): path = path.decode(sys.getfilesystemencoding()) path = os.path.abspath(path)