diff --git a/linux_installer.py b/linux_installer.py
index 7556f438fb..6a1acb40cd 100644
--- a/linux_installer.py
+++ b/linux_installer.py
@@ -6,7 +6,7 @@
'''
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 @@ def run_pyinstaller(args=sys.argv):
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 @@ def run_pyinstaller(args=sys.argv):
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):
@@ -130,7 +133,7 @@ def run_pyinstaller(args=sys.argv):
binaries += plugins
manifest = '/tmp/manifest'
-open(manifest, 'wb').write('\\n'.join(executables))
+open(manifest, 'wb').write('\n'.join(executables))
version = '/tmp/version'
open(version, 'wb').write(__version__)
coll = COLLECT(binaries, pyz,
diff --git a/osx_installer.py b/osx_installer.py
index bd8b57a000..c092650de6 100644
--- a/osx_installer.py
+++ b/osx_installer.py
@@ -39,6 +39,7 @@ class BuildAPP(py2app):
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 = \
@@ -51,7 +52,6 @@ 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):
@@ -60,11 +60,6 @@ def _check_symlinks_prescript():
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
@@ -72,7 +67,6 @@ def _check_symlinks_prescript():
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):
@@ -80,12 +74,10 @@ def _check_symlinks_prescript():
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')
- 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 @@ def run(self):
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')
@@ -280,14 +277,12 @@ def run(self):
f.write(src)
f.close()
print
- print 'Adding GUI main.py'
+ 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)
- f.write('src/calibre/gui2/main.py', 'calibre/gui2/main.py')
+ for script in scripts['gui']+scripts['console']:
+ 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())
- print
print 'Building disk image'
BuildAPP.makedmg(os.path.join(self.dist_dir, APPNAME+'.app'), APPNAME+'-'+VERSION)
@@ -305,11 +300,12 @@ 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.*',
- 'keyword', 'codeop', 'pydoc'],
+ 'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*',
+ 'keyword', 'codeop', 'pydoc', 'readline'],
'packages' : ['PIL', 'Authorization', 'rtf2xml', 'lxml'],
'excludes' : ['IPython'],
'plist' : { 'CFBundleGetInfoString' : '''calibre, an E-book management application.'''
@@ -319,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/setup.py b/setup.py
index 7019e0179c..dcbacb47c4 100644
--- a/setup.py
+++ b/setup.py
@@ -13,9 +13,6 @@
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 b34f86be8e..bcf069dd88 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
')+str(err)).exec_()
+ error_dialog(self, _('Could not fetch cover'), _('Could not fetch cover.
')+unicode(err)).exec_()
finally:
self.fetch_cover_button.setEnabled(True)
self.unsetCursor()
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 @@
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()
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" />
%s:'%self.exception ans += '
%s'%self.last_traceback return ans @@ -381,10 +381,19 @@ def kill_job(self, row, gui_parent): _('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/library.py b/src/calibre/gui2/library.py index 5fdfeae25a..4f567cb496 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -148,9 +148,13 @@ def row_indices(self, index): ''' 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 ] @@ -322,7 +326,7 @@ def get_preferred_formats(self, rows, formats, paths=False): 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/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index edab6b0c1b..2fc4222a8f 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
Could not save the following books to disk, because the %s format is not available for them:
%s:
'%exception + msg = u'%s:'%exception msg += u'
Failed to perform job: '+description msg += u'
Detailed traceback:
' - msg += formatted_traceback + '' - msg += '
Log:
'
- if log:
- msg += log.encode('utf8', 'ignore') if isinstance(log, unicode) else log.decode('utf8', 'ignore')
+ msg += formatted_traceback + u''
+ msg += u'Log:
'
+ msg += log
ConversionErrorDialog(self, 'Conversion Error', msg, show=True)
@@ -1173,7 +1230,7 @@ def update_found(self, version):
device=self.device_info)))
self.vanity.update()
s = Settings()
- if s.get('update to version %s'%version, True):
+ if s.get('new version notification', True) and s.get('update to version %s'%version, True):
d = question_dialog(self, _('Update available'), _('%s has been updated to version %s. See the new features. Visit the download page?')%(__appname__, version))
if d.exec_() == QMessageBox.Yes:
url = 'http://calibre.kovidgoyal.net/download_'+('windows' if iswindows else 'osx' if isosx else 'linux')
@@ -1186,6 +1243,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)
@@ -1193,7 +1257,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__,
@@ -1201,14 +1265,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[1])
return app.exec_()
return 0
@@ -1219,7 +1283,7 @@ def main(args=sys.argv):
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..c84ce915fe 100644
--- a/src/calibre/gui2/main_window.py
+++ b/src/calibre/gui2/main_window.py
@@ -3,13 +3,43 @@
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 getattr(opts, 'redirect', False):
+ self.__console_redirect = DebugWindow(self)
+ sys.stdout = sys.stderr = self.__console_redirect
+ self.__console_redirect.show()
def unhandled_exception(self, type, value, tb):
try:
@@ -19,7 +49,7 @@ def unhandled_exception(self, type, value, tb):
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/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 @@
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/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()
diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py
index 8b9d11bb28..5864c83a38 100644
--- a/src/calibre/library/cli.py
+++ b/src/calibre/library/cli.py
@@ -102,14 +102,14 @@ def command_list(args, dbpath):
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)
@@ -123,6 +123,7 @@ def write(self, msg):
NULL = DevNull()
def do_add(db, paths, one_book_per_directory, recurse, add_duplicates):
+ orig = sys.stdout
sys.stdout = NULL
try:
files, dirs = [], []
@@ -171,26 +172,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
@@ -213,7 +214,7 @@ def command_add(args, dbpath):
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
@@ -243,7 +244,7 @@ def command_remove(args, dbpath):
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 = []
@@ -274,7 +275,7 @@ def command_add_format(args, dbpath):
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]
@@ -300,7 +301,7 @@ def command_remove_format(args, dbpath):
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()
@@ -331,7 +332,7 @@ def command_show_metadata(args, dbpath):
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)
@@ -358,15 +359,47 @@ def command_set_metadata(args, dbpath):
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)
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 fdd46f32fa..ee5632d8c2 100644
--- a/src/calibre/library/database.py
+++ b/src/calibre/library/database.py
@@ -1376,6 +1376,9 @@ def vacuum(self):
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):
@@ -1410,7 +1413,6 @@ def export_to_dir(self, dir, indices, byauthor=False, single_dir=False,
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:
@@ -1537,6 +1539,25 @@ def recursive_import(self, root, single_book_per_directory=True):
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):
diff --git a/src/calibre/libunrar.py b/src/calibre/libunrar.py
index 3348019bac..149b83d1b1 100644
--- a/src/calibre/libunrar.py
+++ b/src/calibre/libunrar.py
@@ -7,10 +7,10 @@
"""
import os, ctypes
from ctypes import Structure, c_char_p, c_uint, c_void_p, POINTER, \
- byref, c_wchar_p, CFUNCTYPE, c_int, c_long, c_char, c_wchar
+ byref, c_wchar_p, c_int, c_char, c_wchar
from StringIO import StringIO
-from calibre import iswindows, isosx, load_library
+from calibre import iswindows, load_library
_librar_name = 'libunrar'
cdll = ctypes.cdll
diff --git a/src/calibre/linux.py b/src/calibre/linux.py
index 3bc5cd9467..d292f244ce 100644
--- a/src/calibre/linux.py
+++ b/src/calibre/linux.py
@@ -46,9 +46,10 @@
'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',
@@ -353,13 +354,20 @@ 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',
f.name, '--manual', __appname__)
manfile = os.path.join(manpath, prog+'.1'+__appname__+'.bz2')
- p = subprocess.Popen(help2man, stdout=subprocess.PIPE)
+ try:
+ p = subprocess.Popen(help2man, stdout=subprocess.PIPE)
+ except OSError, err:
+ import errno
+ if err.errno != errno.ENOENT:
+ raise
+ print 'Failed to install MAN pages as help2man is missing from your system'
+ break
raw = re.compile(r'^\.IP\s*^([A-Z :]+)$', re.MULTILINE).sub(r'.SS\n\1', p.stdout.read())
if not raw.strip():
print 'Unable to create MAN page for', prog
diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py
index c4d45ffce2..2098369fee 100644
--- a/src/calibre/manual/custom.py
+++ b/src/calibre/manual/custom.py
@@ -10,7 +10,7 @@
from docutils.statemachine import ViewList
from docutils import nodes
-from genshi.template import TextTemplate
+from genshi.template import OldTextTemplate as TextTemplate
sys.path.append(os.path.abspath('../../../'))
from calibre.linux import entry_points
diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py
index 7c0c997def..f8a50d3859 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 @@ def repeat(self):
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 @@ def __init__(self, server, port, timeout=5):
raise RuntimeError('Worker sulking')
def terminate(self):
- '''
- Kill process.
- '''
+ 'Kill worker process.'
try:
if self.socket:
self.write('STOP:')
@@ -170,10 +340,12 @@ def terminate(self):
except:
pass
else:
- import signal
try:
- os.kill(self.worker_pid, signal.SIGKILL)
- time.sleep(0.05)
+ try:
+ self.os.kill(self.worker_pid, self.signal.SIGKILL)
+ time.sleep(0.5)
+ finally:
+ self.worker_status.kill()
except:
pass
@@ -188,16 +360,19 @@ def __eq__(self, other):
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 +384,44 @@ def initialize_job(self, job):
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 +504,23 @@ def run(self):
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)
@@ -354,7 +542,10 @@ def run(self):
with self.pool_lock:
self.pool.append(o)
- time.sleep(1)
+ try:
+ time.sleep(1)
+ except:
+ return
def killall(self):
@@ -393,8 +584,8 @@ def run_free_job(self, func, args=[], kwdargs={}):
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 +597,7 @@ 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 = RepeatingTimer(0.5, self.send, 'BufferedSender')
self.timer.start()
def write(self, msg):
@@ -417,6 +607,15 @@ def write(self, msg):
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 +641,18 @@ def notify(self, percent, msg=''):
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 +671,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 +688,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 +700,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 @@ def __init__(self, term_stream=sys.stdout):
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/src/calibre/trac/plugins/download.py b/src/calibre/trac/plugins/download.py
index fe66dad363..ed9a8483a0 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'),
]
@@ -81,9 +80,8 @@ def __init__(self, os):
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:
@@ -231,7 +229,7 @@ def osx(self, req):
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/translations/bg.po b/src/calibre/translations/bg.po
index a8d83a4ce0..1be4668820 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-30 23:41+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-07-02 15:52+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:133
msgid "%sUsage%s: %s\n"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/__init__.py:133
+#: /home/kovid/work/calibre/src/calibre/__init__.py:170
msgid "Created by "
msgstr ""
@@ -31,6 +31,10 @@ msgstr ""
msgid "Unable to detect the %s disk drive. Try rebooting."
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
msgid "Set the title. Default: filename."
msgstr ""
@@ -42,8 +46,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr ""
@@ -66,7 +76,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:409
msgid "Publisher"
msgstr ""
@@ -151,58 +161,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 +242,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 +255,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 +281,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 +363,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:943
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:981
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:996
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:1743
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:1745
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:1767
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:1797
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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -486,11 +515,11 @@ msgstr ""
msgid "Convert LRS to LRS, useful for debugging."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -499,52 +528,52 @@ msgid ""
"\n"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
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
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
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
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
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
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
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
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr ""
@@ -607,11 +636,11 @@ msgid ""
"%prog converts mybook.txt to mybook.lrf"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr ""
@@ -677,11 +706,11 @@ msgid ""
"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr ""
@@ -693,19 +722,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr ""
@@ -713,18 +742,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr ""
@@ -743,144 +772,148 @@ msgstr ""
msgid "Choose Format"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
msgid "Advanced"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
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:102
msgid "Invalid database location "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
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:117
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:117
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/dialogs/config_ui.py:202
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
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:494
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Large"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
msgid "Medium"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
msgid "Small"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
msgid "&Button size in toolbar"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
msgid "Show &text in toolbar buttons"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
-msgid "Free unused diskspace from the database"
+msgid "Frequently used directories"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+msgid "Add a directory to the frequently used directories list"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
+msgid "Remove a directory from the frequently used directories list"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
+msgid "Free unused diskspace from the database"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr ""
@@ -889,9 +922,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr ""
@@ -903,19 +936,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 +972,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 +988,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 +996,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,435 +1008,454 @@ 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:177
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 "- baen - Books from BAEN Publishers
"
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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
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 "- book-designer - HTML0 files from Book Designer
"
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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
msgid "&Publisher: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503
-#: /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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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"
""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
@@ -1422,49 +1482,44 @@ 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
-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 +1548,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr ""
@@ -1607,95 +1662,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+"\n"
""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1545,32 +1605,39 @@ msgstr ""
"Especifiqueu com s'ha d'ordenar l'autor(s) d'aquest llibre. Per "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " estreles"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "Afe&geix les etiquetes: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
@@ -1597,50 +1664,45 @@ 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
-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 +1731,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Format"
@@ -1783,95 +1845,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+#~ ""
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ ""
+
+#: /home/kovid/work/calibre/src/calibre/__init__.py:133
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:170
msgid "Created by "
msgstr "Erstellt von "
@@ -71,7 +103,11 @@ 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/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
+msgstr "Im Reader ist keine Speicherkarte eingesteckt."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
msgid "Set the title. Default: filename."
@@ -86,8 +122,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr "Unbekannt"
@@ -110,7 +152,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:409
msgid "Publisher"
msgstr "Herausgeber"
@@ -169,7 +211,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 +264,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 +274,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 +316,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 +340,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 +372,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 +392,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 +409,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 +427,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 +456,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 +514,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 +533,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:943
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:981
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:996
msgid ""
"Could not process image: %s\n"
"%s"
@@ -522,14 +590,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:1743
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:1745
msgid ""
"Bad table:\n"
"%s"
@@ -537,11 +605,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:1767
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:1797
msgid ""
"You have to save the website %s as an html file first and then run html2lrf "
"on it."
@@ -549,19 +617,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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -640,11 +708,11 @@ msgstr "Mit mehr Wörtern fortfahren"
msgid "Convert LRS to LRS, useful for debugging."
msgstr "Konvertierung von LRS in LRS, hilfreich bei der Fehlersuche."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr "Ungültige LRF Datei. Konnte Meta-Daten nicht festlegen."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -658,45 +726,45 @@ msgstr ""
"Zeigt/verändert die Metadaten in einer LRF Datei.\n"
"\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr "Geben Sie den Buchtitel an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr "Sortierung nach Titel"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr "Geben Sie den Autor an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set sort key for the author"
msgstr "Sortierung nach Autor"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr "Die Kategorie dieses Buches ... (Z. B.: Geschichte)"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr ""
"Pfad zu einer Grafik, die als Thumbnail für diese Datei verwendet werden soll"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
"Pfad zu einer Text Datei, deren Inhalt als Bemerkung in der LRF Datei "
"gespeichert wird"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr "Thumbnail von LRF Datei extrahieren"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -705,11 +773,11 @@ msgstr ""
"festgelegt ist, werden Suchmethoden verwendet, um das Umschlagbild zu "
"erraten."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr "Geben Sie die Buch ID an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr "Was weiß ich, für was das ist"
@@ -794,11 +862,11 @@ msgstr ""
"\n"
"%prog konvertiert dateiname.txt in dateiname.lrf"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr "Gebe Autoren ein"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr "Gebe Kommentar ein"
@@ -882,11 +950,11 @@ msgstr ""
"Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com "
"abrufen\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr "Benutzung: %s dateiname.lit"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr "Umschlagbild gespeichert unter"
@@ -898,19 +966,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr "OEB eBook erstellt in"
@@ -918,18 +986,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr "Bemerkung"
@@ -948,82 +1016,90 @@ msgstr "TextLabel"
msgid "Choose Format"
msgstr "Format wählen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr "Einfach"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
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:102
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:102
msgid "Invalid database location "
msgstr "Ortsangabe der Datenbank ungültig "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
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:117
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:117
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/dialogs/config_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265
msgid "Configuration"
msgstr "Konfiguration"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr "Speicherort der Bücherdatenbank (&library1.db)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
msgid "Browse for the new database location"
msgstr "Zu einem neuen Ort der Datenbank wechseln"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py: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/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr "&Römische Ziffern für Serien Nummerierung verwenden"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr "Format zur &Speicherung einer Datei:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr "&Priorität der Konvertierungsaufträge:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr "Voreinstellung für Zei&tüberschreitung bei Netzwerkverbindungen:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
@@ -1031,65 +1107,61 @@ msgstr ""
"Voreinstellung der Zeitüberschreitung für Netzwerkabrufe festsetzen (Gilt "
"immer dann, wenn aus dem Internet Informationen abgerufen werden sollen)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
msgid " seconds"
msgstr " Sekunden"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
-msgid "&Priority for conversion jobs:"
-msgstr "&Priorität der Konvertierungsaufträge:"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
+msgid "Toolbar"
+msgstr "Symbolleiste"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
+msgid "Large"
+msgstr "Groß"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
+msgid "Medium"
+msgstr "Mittel"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+msgid "Small"
+msgstr "Klein"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+msgid "&Button size in toolbar"
+msgstr "&Größe der Schaltflächen in der Symbolleiste"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+msgid "Show &text in toolbar buttons"
+msgstr "Zeige &Text in Schaltflächen der Symbolleiste"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
msgid "Frequently used directories"
msgstr "Häufig benutzte Verzeichnisse"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
msgid "Add a directory to the frequently used directories list"
msgstr ""
"Ein Verzeichnis zur Liste der häufig genutzten Verzeichnisse hinzufügen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
msgid "Remove a directory from the frequently used directories list"
msgstr ""
"Ein Verzeichnis von der Liste der häufig genutzten Verzeichnisse entfernen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
-msgid "Select visible &columns in library view"
-msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
-msgid "Toolbar"
-msgstr "Symbolleiste"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
-msgid "Large"
-msgstr "Groß"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
-msgid "Medium"
-msgstr "Mittel"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
-msgid "Small"
-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"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
-msgid "Show &text in toolbar buttons"
-msgstr "Zeige &Text in Schaltflächen der Symbolleiste"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
msgid "Free unused diskspace from the database"
msgstr "Freier unbenutzter Festplattenspeicher der Datenbank"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
msgstr "Datenbank &komprimieren"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr "&Meta-Daten aus dem Dateinamen"
@@ -1098,9 +1170,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr "Autor(en)"
@@ -1112,21 +1184,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 +1227,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 +1245,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 +1253,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 +1265,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:177
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 +1340,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 "- baen - Books from BAEN Publishers
"
msgstr "- baen - Bücher von BAEN Publishers
"
-#: /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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
@@ -1272,11 +1352,11 @@ msgstr ""
"- pdftohtml - HTML Dateien, die mit dem Programm pdftohtml erstellt "
"wurden
"
-#: /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 "- book-designer - HTML0 files from Book Designer
"
msgstr "- book-designer - HTML Dateien von Book Designer
"
-#: /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 +1365,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 +1373,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 +1381,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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
@@ -1371,30 +1451,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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
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/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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -1403,183 +1483,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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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,28 +1681,28 @@ msgstr ""
"\n"
+"\n"
""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1618,32 +1710,39 @@ msgstr ""
"Geben Sie an, wie der Autor dieses Buches sortiert werden soll. \"Charles "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " Sterne"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "&Etiketten hinzufügen: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Etiketten-Editor öffnen"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "Etiketten entfe&rnen:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
"Durch getrennte Liste der Etiketten, die von den Büchern entfernt werden. "
@@ -1674,50 +1773,45 @@ 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
-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 +1840,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Format"
@@ -1870,96 +1964,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+""
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
+msgid "Edit Meta information"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257
+msgid "Meta information"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262
+msgid "Author S&ort: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263
+msgid ""
+"Specify how the author(s) of this book should be sorted. For example Charles "
+"Dickens should be sorted as Dickens, Charles."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264
+msgid "&Rating:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
+msgid "Rating of this book. 0-5 stars"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
+msgid " stars"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
+msgid "Add Ta&gs: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
+msgid "&Remove tags:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
+msgid "Comma separated list of tags to remove from the books. "
+msgstr ""
+
+#: /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: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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
+msgid "Series"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:689
+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:73
+msgid "Advanced Search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74
+msgid "Match a&ll of the following criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75
+msgid "Match a&ny of the following criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76
+msgid "Search criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77
+msgid "More"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78
+msgid "Fewer"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123
+msgid "Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124
+msgid "A&vailable tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125
+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
+msgid "Apply tag to current book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129
+msgid "A&pplied tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130
+msgid "Unapply (remove) tag from current book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132
+msgid "&Add tag:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133
+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
+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:214
+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:208
+msgid "Add custom news source"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209
+msgid "Available user recipes"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210
+msgid "Add/Update &recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211
+msgid "&Remove recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212
+msgid "&Share recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213
+msgid "&Load recipe from file"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215
+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:219
+msgid "Recipe &title:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220
+msgid "&Oldest article:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221
+msgid "The oldest article to download"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222
+msgid " days"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223
+msgid "&Max. number of articles per feed:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224
+msgid "Maximum number of articles to download per feed."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225
+msgid "Feeds in recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227
+msgid "Remove feed from recipe"
+msgstr ""
+
+#: /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:233
+msgid "Add feed to recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231
+msgid "&Feed title:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232
+msgid "Feed &URL:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234
+msgid "&Add feed"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235
+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:236
+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)"
+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)"
+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)"
+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
+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/library.py:235
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:245
+msgid "None"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:236
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:410
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:695
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:759
+msgid "Tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242
+msgid "Formats"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:251
+msgid "Book %s of %s."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396
+msgid "Double click to edit me
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:757
+msgid "Size (MB)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:758
+msgid "Date"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:408
+msgid "Rating"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690
+msgid "Path"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:694
+msgid "Timestamp"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:794
+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 "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 "No matches for the search phrase %s 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:82
+msgid "Error communicating with device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95
+msgid ""
+"For help visit %s.kovidgoyal.net
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96
+msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116
+msgid "Send to main memory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117
+msgid "Send to storage card"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117
+msgid "and delete from library"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119
+msgid "Send to storage card by default"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131
+msgid "Edit metadata individually"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132
+msgid "Edit metadata in bulk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135
+msgid "Add books from a single directory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136
+msgid ""
+"Add books recursively (One book per directory, assumes every ebook file is "
+"the same book in a different format)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137
+msgid ""
+"Add books recursively (Multiple books per directory, assumes every ebook "
+"file is a different book)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275
+msgid "Save to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153
+msgid "Save to disk in a single directory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154
+msgid "Save only %s format to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281
+msgid "View"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158
+msgid "View specific format"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174
+msgid "Convert individually"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175
+msgid "Bulk convert"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309
+msgid " detected."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309
+msgid "Device: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:334
+msgid "Connected "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:346
+msgid "Device database corrupted"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:347
+msgid ""
+"\n"
+" The database of books on the reader is corrupted. Try the "
+"following:\n"
+"
\n"
+" - 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.
\n"
+" - 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.
\n"
+"
\n"
+" "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:399
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:473
+msgid ""
+"Books with the same title as the following already exist in the database. "
+"Add them anyway?
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:402
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:476
+msgid "Duplicates found!"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:435
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:448
+msgid "Uploading books to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:507
+msgid "No space on device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:508
+msgid ""
+"Cannot upload books to device there is no more free space available "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:546
+msgid "Deleting books from device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599
+msgid "Cannot edit metadata"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834
+msgid "No books selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:674
+msgid "Sending books to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:677
+msgid "No suitable formats"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:678
+msgid ""
+"Could not upload the following books to the device, as no suitable formats "
+"were found:
%s
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
+msgid "Cannot save to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:705
+msgid ""
+"Could not save the following books to disk, because the %s format is not "
+"available for them:
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:709
+msgid "Could not save some ebooks"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742
+msgid "Fetch news from "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:744
+msgid "Fetching news from "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:754
+msgid "News fetched. Uploading to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834
+msgid "Cannot convert"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773
+msgid "Starting Bulk conversion of %d books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923
+msgid "No book selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:937
+msgid "Cannot view"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942
+msgid "Choose the format to view"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938
+msgid "%s has no available formats."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
+msgid "Cannot configure"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
+msgid "Cannot configure while there are running jobs."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:999
+msgid "Copying database to "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1014
+msgid "Invalid database"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1015
+msgid ""
+"An invalid database already exists at %s, delete it before trying to move "
+"the existing database.
Error: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1023
+msgid "Could not move database"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1044
+msgid "No detailed info available"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1045
+msgid "No detailed information is available for books on the device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1087
+msgid "Error talking to device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1088
+msgid ""
+"There was a temporary error talking to the device. Please unplug and "
+"reconnect the device and or reboot."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1139
+msgid "Conversion Error"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158
+msgid "Database does not exist"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158
+msgid ""
+"The directory in which the database should be: %s no longer exists. Please "
+"choose a new database location."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1209
+msgid ""
+"Latest version: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215
+msgid ""
+"%s has been updated to version %s. See the new features. "
+"Visit the download page?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215
+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
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
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:52
+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 ""
+"
Please enter your username and password for %s
If you do not have one, "
+"please subscribe to get access to the articles.
Click OK to proceed."
+msgstr ""
+
+#: /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 ""
+"
Browsing books by their covers is disabled.
Import of pictureflow "
+"module failed:
"
+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:698
+msgid "Untitled Article"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:744
+msgid ""
+"\n"
+"Downloaded article %s from %s\n"
+"%s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:750
+msgid "Article downloaded: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:756
+msgid "Failed to download article: %s from %s\n"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:761
+msgid "Article download failed: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:776
+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 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..0cb1067064 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"
-"Last-Translator: S. Dorscht \n"
+"POT-Creation-Date: 2008-06-30 23:41+0000\n"
+"PO-Revision-Date: 2008-06-29 16:58+0000\n"
+"Last-Translator: Kovid Goyal \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-07-02 15:52+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#~ msgid ""
@@ -37,6 +37,12 @@ msgstr ""
#~ "Expresión regular. Las marcas 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,15 @@ msgstr ""
#~ "fuents, familia\" ( --serif-family \"%s, Times New Roman\")\n"
#~ " "
+#~ msgid "&Access Key;"
+#~ msgstr "Clave de &acceso;"
+
+#~ msgid "Cannot kill waiting jobs."
+#~ msgstr "No se pueden detener trabajos en espera"
+
+#~ 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 +154,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 ""
+#~ "\n"
+#~ "\n"
+#~ ""
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ ""
+
+#: /home/kovid/work/calibre/src/calibre/__init__.py:133
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:170
msgid "Created by "
msgstr "Creado por "
@@ -153,6 +191,10 @@ msgstr "Creado por "
msgid "Unable to detect the %s disk drive. Try rebooting."
msgstr "No se ha podido detectar la unidad de disco %s. Trate de reiniciar."
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
msgid "Set the title. Default: filename."
msgstr "Insertar título. Por defecto: nombre_del_archivo."
@@ -166,8 +208,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr "Desconocido"
@@ -190,7 +238,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:409
msgid "Publisher"
msgstr "Editorial"
@@ -225,6 +273,10 @@ msgid ""
"option obsoletes the --font-delta option and takes precedence over it. To "
"use --font-delta, set this to 0. Default: %defaultpt"
msgstr ""
+"Especifique el tamaño de la fuente base en puntos. Todas las fuentes serán "
+"reescaladas en concordancia. Esta opción deja obsoleta la oción --font-delta "
+"y prioriza sobre ella en el caso de que esté asignada. Para usar --font-"
+"delta, iguale ésta variable a 0. Configuración por defecto: %defaultpt"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:100
msgid "Enable autorotation of images that are wider than the screen width."
@@ -296,7 +348,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 +358,39 @@ 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 ""
+"Renderizar las tablas en documentos html como imágenes (Muy útil si el "
+"documento consta de tablas grandes o complejas."
+
+#: /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 ""
+"Multiplicar el tamaño del texto en las tablas renderizadas por éste factor. "
+"Por defecto es: %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 "
@@ -331,7 +399,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 ."
-#: /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"
@@ -339,18 +407,15 @@ msgstr ""
"Una expresión regular. Las etiquetas 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 +423,20 @@ 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 ""
+"Detectar el comienzo de un capítulo en un elemento que contenga el atributo "
+"especificado. El formato para ésta espresión es tagname regexp, nombre del "
+"atributo, valor del atributo regexp. Por ejemplo, para encontrar todas las "
+"etiquetas de cabecera que tienen como attribute class=\"capítulo\" podría "
+"usar: \"h/d,class,capítulo\". El valor por defecto es: %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 "
@@ -376,14 +454,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 +473,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,39 +490,44 @@ 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 "
"slower page turns. For example: --serif-family \"Times New Roman\"\n"
" "
msgstr ""
+"Especificar familias truetype para serif, sans-serif y funetes monoespacio. "
+"Éstas fuentes se integrarán en el fichero LRF. Como observación: fuentes "
+"customizadas hacen que los cambios de páginas sean más lentos. Por ejemplo: -"
+"-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 "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 +535,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 +606,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:943
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:981
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:996
msgid ""
"Could not process image: %s\n"
"%s"
@@ -580,14 +663,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:1743
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:1745
msgid ""
"Bad table:\n"
"%s"
@@ -595,11 +678,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:1767
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:1797
msgid ""
"You have to save the website %s as an html file first and then run html2lrf "
"on it."
@@ -607,19 +690,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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -699,11 +782,11 @@ msgstr "Procesado detallado"
msgid "Convert LRS to LRS, useful for debugging."
msgstr "Convierte LRS a LRS, útil para depurar."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr "Archivo LRF no válido. No se pudo asignar metadatos."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -717,43 +800,43 @@ msgstr ""
"Ver/editar los metadatos en un archivo LRF.\n"
"\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr "Insertar el nombre del libro"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr "Insertar la clave de orden por título"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr "Insertar el autor"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set sort key for the author"
msgstr "Insertar la clave de orden por autor"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr "Categoria a la que pertenece el libro. Por ejemplo, Historia"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr "Ruta al archivo de imagen que se utilizará como miniatura"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
"Ruta al archivo txt que contiene el comentaria a guardar en el archivo LRF"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr "Extraer la miniatura del archivo LRF"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -761,11 +844,11 @@ msgstr ""
"Extraer portada de un archivo LRF. Nótese que el formato LRF no contiene una "
"portada predefinida, así que se usa heurística para encontrar la portada."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr "Insertar el ID del libro"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr "No sé para qué sirve esto"
@@ -846,11 +929,11 @@ msgstr ""
"\n"
"%prog convierte milibro.txt en milibro.lrf"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr "Introduzca los autores"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr "Vea el comentario"
@@ -931,11 +1014,11 @@ msgstr ""
"Adquiere una portada para el libro identificado por el ISBN en "
"LibraryThing.com\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr "Uso: %s archivo.lit"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr "Portada guardada en"
@@ -947,19 +1030,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr "Ebook OEB creado en"
@@ -967,18 +1050,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr "Comentarios"
@@ -997,82 +1080,90 @@ msgstr "TextLabel"
msgid "Choose Format"
msgstr "Elegir formato"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr "Básico"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
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:102
msgid "
Must be a directory."
msgstr "
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:102
msgid "Invalid database location "
msgstr "Ubicación no válida "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
msgid "Invalid database location.
Cannot write to "
msgstr "Ubicación no válida.
Imposible escribir en "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:117
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:117
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/dialogs/config_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265
msgid "Configuration"
msgstr "Configuración"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr "&Ubicación de la base de datos (library1.db)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
msgid "Browse for the new database location"
msgstr "Navegar a la nueva ubicación de la base de datos"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py: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/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr "Uso de numerales &romanos para números de serie"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr "&Prioridad para los trabajos de conversión:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr "&timeout por defecto de la red:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
@@ -1080,63 +1171,59 @@ msgstr ""
"Establecer el tiempo de espera maximo para peticiones de red (cuando "
"conectamos a internet para adquirir alguna información)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
msgid " seconds"
msgstr " segundos"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
-msgid "&Priority for conversion jobs:"
-msgstr "&Prioridad para los trabajos de conversión:"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
-msgid "Frequently used directories"
-msgstr "Directorios usados con frecuencia"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
-msgid "Add a directory to the frequently used directories list"
-msgstr "Añadir directorio a la lista de directorios frecuentes"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
-msgid "Remove a directory from the frequently used directories list"
-msgstr "Eliminar directorio a la lista de directorios frecuentes"
-
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
-msgid "Select visible &columns in library view"
-msgstr "Seleccione las &columnas visibles en la vista de biblioteca"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Toolbar"
msgstr "Barra de herramientas"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Large"
msgstr "Grande"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
msgid "Medium"
msgstr "Medio"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
msgid "Small"
msgstr "Pequeño"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
msgid "&Button size in toolbar"
msgstr "Tamaño de &botón en la barra de herramientas"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
msgid "Show &text in toolbar buttons"
msgstr "Mostrar &texto en los botones de la barra de herramientas"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr "Seleccione las &columnas visibles en la vista de biblioteca"
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
+msgid "Frequently used directories"
+msgstr "Directorios usados con frecuencia"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+msgid "Add a directory to the frequently used directories list"
+msgstr "Añadir directorio a la lista de directorios frecuentes"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
+msgid "Remove a directory from the frequently used directories list"
+msgstr "Eliminar directorio a la lista de directorios frecuentes"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
msgid "Free unused diskspace from the database"
msgstr "Espacio de disco disponible de la base de datos"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
msgstr "&Compactar base de datos"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr "&Metadatos a partir del nombre de archivo"
@@ -1145,9 +1232,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr "Autor(es)"
@@ -1159,19 +1246,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 +1286,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 +1302,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 +1310,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 +1322,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:177
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 "There was an error reading from file:
"
msgstr "
Hubo un error leyendo el archivo:
"
-#: /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 +1395,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 "- baen - Books from BAEN Publishers
"
msgstr "- baen - Libros de BAEN Publishers
"
-#: /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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
msgstr ""
"- pdftohtml - Archivos HTML creados con el programa pdftohtml
"
-#: /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 "- book-designer - HTML0 files from Book Designer
"
msgstr "- book-designer - Archivos HTML0 de Book Designer
"
-#: /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."
@@ -1323,7 +1418,7 @@ msgstr ""
"Especificar datos como título y autor para el libro.
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 +1426,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 "No help available"
msgstr "Ayuda no disponible"
-#: /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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
@@ -1408,30 +1503,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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
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/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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -1439,183 +1534,196 @@ msgstr ""
"Etiquetas para categorizar el libr (muy útil en búsquedas).
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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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
CSS"
msgstr "Substituye
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 "&Multiplicador para tamaño del texto en las tablas renderizadas."
+
+#: /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 "Detectar Capítulo &at tag:"
+
+#: /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 ""
"\n"
"
\n"
+"\n"
""
@@ -1625,28 +1733,28 @@ msgstr ""
"\n"
+"\n"
""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1654,32 +1762,39 @@ msgstr ""
"Especificar cómo ordenar el(los) autor(es) de este libro. Por ejemplo,ordena "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " estrellas"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "Aña&dir las etiquetas: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Abrir editor de etiquetas"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "&Quitar etiquetas"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr "Lista de etiquetas separadas por comas para eliminar de los libros "
@@ -1709,52 +1824,47 @@ 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
-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 +1893,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Formato"
@@ -1906,95 +2016,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:214
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 "Could not create recipe. Error:
%s"
msgstr "
No se puede crear la receta. Error:
%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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+"\n"
""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
msgid "Edit Meta information"
msgstr "Editer les informations Metadata"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257
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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1596,32 +1656,39 @@ msgstr ""
"Définit comment l'auteur de ce livre doit être classé. Par exemple, Charles "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " étoiles"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "Ajout de Ta&gs : "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Ouvre l'éditeur de mots-clefs"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "&Supprime des mots-clefs :"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr "Liste de mots-clefs séparés par des virgules à retirer des livres. "
@@ -1651,51 +1718,46 @@ 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
-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 +1786,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Format"
@@ -1841,95 +1903,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+#~ ""
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ ""
+
+#: /home/kovid/work/calibre/src/calibre/__init__.py:133
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:170
msgid "Created by "
msgstr "Creato da "
@@ -81,6 +119,10 @@ msgstr "Creato da "
msgid "Unable to detect the %s disk drive. Try rebooting."
msgstr "Impossibile individuare il disco %s. Provare a riavviare."
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
+msgstr "Il lettore non ha una scheda di memoria connessa."
+
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
msgid "Set the title. Default: filename."
msgstr "Imposta il titolo. Predefinito: nome del file"
@@ -94,8 +136,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr "Sconosciuto"
@@ -118,7 +166,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:409
msgid "Publisher"
msgstr "Editore"
@@ -230,7 +278,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 +288,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 tags are "
@@ -266,7 +330,7 @@ msgstr ""
"0 significa che i link non vengono seguiti. Un valore negativo significa che "
"i tag 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. tags whose href matches will be ignored. Defaults "
"to %default"
@@ -274,18 +338,15 @@ msgstr ""
"Un'espressione regolare. I tag 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 +354,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 +386,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 +406,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 +422,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 +439,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 +467,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 +541,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:943
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:981
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:996
msgid ""
"Could not process image: %s\n"
"%s"
@@ -524,14 +598,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:1743
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:1745
msgid ""
"Bad table:\n"
"%s"
@@ -539,11 +613,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:1767
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:1797
msgid ""
"You have to save the website %s as an html file first and then run html2lrf "
"on it."
@@ -551,19 +625,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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -603,7 +677,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..."
@@ -642,11 +716,11 @@ msgstr "Processamento prolisso"
msgid "Convert LRS to LRS, useful for debugging."
msgstr "Converte LRS in LRS, utile per il debugging"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr "File LRF non valido. Impossibile inviare metadati."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -660,44 +734,44 @@ msgstr ""
"Mostra/modifica i metadati in un file LRF\n"
"\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr "Imposta il titolo del libro"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr "Imposta la chiave per la classificazione del titolo"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr "Imposta l'autore"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set sort key for the author"
msgstr "Imposta la chiave per la classificazione dell'autore"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr "La categoria a cui questo libro appartiene. Es: Storia"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr ""
"Percorso a un'immagine che verrà impostata come miniatura di questo file"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
"Percorso a un file TXT contenente il commento che verrà incluso nel file LRF"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr "Estrae la miniatura da un file LRF"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -706,11 +780,11 @@ msgstr ""
"copertina definita, quindi viene usato un algoritmo euristico per provare ad "
"indovinare la copertina."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr "Imposta l'ID del libro"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr "Non so a cosa serve questo"
@@ -793,11 +867,11 @@ msgstr ""
"\n"
"%prog converte miolibro.txt in miolibro.lrf"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr "Imposta gli autori"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr "Imposta il commento"
@@ -881,11 +955,11 @@ msgstr ""
"Scarica un'immagine di copertina per il libro identificato dall'ISBN da "
"LibraryThing.com\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr "Uso: %s file.lit"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr "Copertina salvata in"
@@ -897,19 +971,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr "Libro OEB creato in"
@@ -917,18 +991,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr "Commenti"
@@ -947,82 +1021,90 @@ msgstr "EtichettaDiTesto"
msgid "Choose Format"
msgstr "Scegliere il formato"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr "Base"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
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:102
msgid "
Must be a directory."
msgstr "
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:102
msgid "Invalid database location "
msgstr "Percorso database non valido "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
msgid "Invalid database location.
Cannot write to "
msgstr "Percorso database non valido.
Impossibile scrivere su "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:117
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:117
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/dialogs/config_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265
msgid "Configuration"
msgstr "Configurazione"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr "&Posizione del database dei libri (library1.db)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
msgid "Browse for the new database location"
msgstr "Sfoglia per specificare una nuova posizione del database"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py: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/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr "&Usare numeri romani per i numeri delle serie"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr "&Formato per salvataggio singolo file:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr "Pri&orità per i lavori di conversione:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr "&Timeout predefinito della rete:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
@@ -1030,63 +1112,59 @@ msgstr ""
"Imposta il timeout predefinito per gli scaricamenti dalla rete (cioè ogni "
"volta che si usa Internet per prelevare informazioni)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
msgid " seconds"
msgstr " secondi"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
-msgid "&Priority for conversion jobs:"
-msgstr "Pri&orità per i lavori di conversione:"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
-msgid "Frequently used directories"
-msgstr "Cartelle usate frequentemente"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
-msgid "Add a directory to the frequently used directories list"
-msgstr "Aggiunge una cartella alla lista delle cartelle usate frequentemente"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
-msgid "Remove a directory from the frequently used directories list"
-msgstr "Rimuove una cartella dalla lista delle cartelle usate frequentemente"
-
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
-msgid "Select visible &columns in library view"
-msgstr "&Selezionare le colonne visibili nella vista biblioteca"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Toolbar"
msgstr "Barra degli strumenti"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Large"
msgstr "Grande"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
msgid "Medium"
msgstr "Media"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
msgid "Small"
msgstr "Piccola"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
msgid "&Button size in toolbar"
msgstr "&Dimensione bottoni nella barra degli strumenti"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
msgid "Show &text in toolbar buttons"
msgstr "&Mostra testo nei bottoni della barra degli strumenti"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr "&Selezionare le colonne visibili nella vista biblioteca"
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
+msgid "Frequently used directories"
+msgstr "Cartelle usate frequentemente"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+msgid "Add a directory to the frequently used directories list"
+msgstr "Aggiunge una cartella alla lista delle cartelle usate frequentemente"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
+msgid "Remove a directory from the frequently used directories list"
+msgstr "Rimuove una cartella dalla lista delle cartelle usate frequentemente"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
msgid "Free unused diskspace from the database"
msgstr "Libera lo spazio non utilizzato dal database"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
msgstr "&Compatta database"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr "&Metadati dal nome del file"
@@ -1095,9 +1173,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr "Autore(i)"
@@ -1109,20 +1187,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 +1229,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 +1247,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 +1255,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 +1267,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:177
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 "There was an error reading from file:
"
msgstr "
Si è verificato un errore nella lettura del file:
"
-#: /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 +1341,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 "- baen - Books from BAEN Publishers
"
msgstr "- baen - Libri dall'editore BAEN
"
-#: /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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
msgstr ""
"- pdftohtml - File HTML generati dal programma pdftohtml
"
-#: /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 "- book-designer - HTML0 files from Book Designer
"
msgstr "- book-designer - File HTML0 da Book Designer
"
-#: /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."
@@ -1278,7 +1364,7 @@ msgstr ""
"Specifica metadati come il titolo e l'autore del libro.
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 +1372,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 +1380,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 "No help available"
msgstr "Nessun aiuto disponibile"
-#: /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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
@@ -1367,30 +1453,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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
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/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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -1399,183 +1485,196 @@ msgstr ""
"ricerche.
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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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
CSS"
msgstr "Sovrascrivi
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 ""
"\n"
"
\n"
+"\n"
""
@@ -1585,28 +1684,28 @@ msgstr ""
"\n"
+"\n"
""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1614,32 +1713,39 @@ msgstr ""
"Specifica come deve essere classificato l'autore di questo libro. Ad "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " stelle"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "&Aggiungi tag: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Apri l'editor dei tag"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "&Rimuovi tag:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr "Lista separata da virgole dei tag da rimuovere dal libro "
@@ -1669,50 +1775,45 @@ 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
-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 +1842,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Formato"
@@ -1861,95 +1962,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:214
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 "Could not create recipe. Error:
%s"
msgstr "
Impossibile creare la formula. Errore:
%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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+#~ ""
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ ""
+
+#: /home/kovid/work/calibre/src/calibre/__init__.py:133
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:170
msgid "Created by "
msgstr "Erstellt von "
@@ -71,7 +103,11 @@ 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/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
+msgstr "Im Reader ist keine Speicherkarte eingesteckt."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
msgid "Set the title. Default: filename."
@@ -86,8 +122,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr "Unbekannt"
@@ -110,7 +152,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:409
msgid "Publisher"
msgstr "Herausgeber"
@@ -169,7 +211,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 +264,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 +274,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 +316,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 +340,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 +372,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 +392,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 +409,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 +427,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 +456,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 +514,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 +533,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:943
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:981
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:996
msgid ""
"Could not process image: %s\n"
"%s"
@@ -522,14 +590,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:1743
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:1745
msgid ""
"Bad table:\n"
"%s"
@@ -537,11 +605,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:1767
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:1797
msgid ""
"You have to save the website %s as an html file first and then run html2lrf "
"on it."
@@ -549,19 +617,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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -640,11 +708,11 @@ msgstr "Mit mehr Wörtern fortfahren"
msgid "Convert LRS to LRS, useful for debugging."
msgstr "Konvertierung von LRS in LRS, hilfreich bei der Fehlersuche."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr "Ungültige LRF Datei. Konnte Meta-Daten nicht festlegen."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -658,45 +726,45 @@ msgstr ""
"Zeigt/verändert die Metadaten in einer LRF Datei.\n"
"\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr "Geben Sie den Buchtitel an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr "Sortierung nach Titel"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr "Geben Sie den Autor an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set sort key for the author"
msgstr "Sortierung nach Autor"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr "Die Kategorie dieses Buches ... (Z. B.: Geschichte)"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr ""
"Pfad zu einer Grafik, die als Thumbnail für diese Datei verwendet werden soll"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
"Pfad zu einer Text Datei, deren Inhalt als Bemerkung in der LRF Datei "
"gespeichert wird"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr "Thumbnail von LRF Datei extrahieren"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -705,11 +773,11 @@ msgstr ""
"festgelegt ist, werden Suchmethoden verwendet, um das Umschlagbild zu "
"erraten."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr "Geben Sie die Buch ID an"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr "Was weiß ich, für was das ist"
@@ -794,11 +862,11 @@ msgstr ""
"\n"
"%prog konvertiert dateiname.txt in dateiname.lrf"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr "Gebe Autoren ein"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr "Gebe Kommentar ein"
@@ -882,11 +950,11 @@ msgstr ""
"Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com "
"abrufen\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr "Benutzung: %s dateiname.lit"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr "Umschlagbild gespeichert unter"
@@ -898,19 +966,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr "OEB eBook erstellt in"
@@ -918,18 +986,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr "Bemerkung"
@@ -948,82 +1016,90 @@ msgstr "TextLabel"
msgid "Choose Format"
msgstr "Format wählen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr "Einfach"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
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:102
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:102
msgid "Invalid database location "
msgstr "Ortsangabe der Datenbank ungültig "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
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:117
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:117
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/dialogs/config_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265
msgid "Configuration"
msgstr "Konfiguration"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr "Speicherort der Bücherdatenbank (&library1.db)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
msgid "Browse for the new database location"
msgstr "Zu einem neuen Ort der Datenbank wechseln"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py: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/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr "&Römische Ziffern für Serien Nummerierung verwenden"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr "Format zur &Speicherung einer Datei:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr "&Priorität der Konvertierungsaufträge:"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr "Voreinstellung für Zei&tüberschreitung bei Netzwerkverbindungen:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
@@ -1031,65 +1107,61 @@ msgstr ""
"Voreinstellung der Zeitüberschreitung für Netzwerkabrufe festsetzen (Gilt "
"immer dann, wenn aus dem Internet Informationen abgerufen werden sollen)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
msgid " seconds"
msgstr " Sekunden"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
-msgid "&Priority for conversion jobs:"
-msgstr "&Priorität der Konvertierungsaufträge:"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
+msgid "Toolbar"
+msgstr "Symbolleiste"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
+msgid "Large"
+msgstr "Groß"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
+msgid "Medium"
+msgstr "Mittel"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+msgid "Small"
+msgstr "Klein"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+msgid "&Button size in toolbar"
+msgstr "&Größe der Schaltflächen in der Symbolleiste"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+msgid "Show &text in toolbar buttons"
+msgstr "Zeige &Text in Schaltflächen der Symbolleiste"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
msgid "Frequently used directories"
msgstr "Häufig benutzte Verzeichnisse"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
msgid "Add a directory to the frequently used directories list"
msgstr ""
"Ein Verzeichnis zur Liste der häufig genutzten Verzeichnisse hinzufügen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
msgid "Remove a directory from the frequently used directories list"
msgstr ""
"Ein Verzeichnis von der Liste der häufig genutzten Verzeichnisse entfernen"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
-msgid "Select visible &columns in library view"
-msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
-msgid "Toolbar"
-msgstr "Symbolleiste"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
-msgid "Large"
-msgstr "Groß"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
-msgid "Medium"
-msgstr "Mittel"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
-msgid "Small"
-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"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
-msgid "Show &text in toolbar buttons"
-msgstr "Zeige &Text in Schaltflächen der Symbolleiste"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
msgid "Free unused diskspace from the database"
msgstr "Freier unbenutzter Festplattenspeicher der Datenbank"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
-msgstr "Datenbank verdi&chten"
+msgstr "Datenbank &komprimieren"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr "&Meta-Daten aus dem Dateinamen"
@@ -1098,9 +1170,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr "Autor(en)"
@@ -1112,21 +1184,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 +1227,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 +1245,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 +1253,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 +1265,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:177
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 +1340,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 "- baen - Books from BAEN Publishers
"
msgstr "- baen - Bücher von BAEN Publishers
"
-#: /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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
@@ -1272,11 +1352,11 @@ msgstr ""
"- pdftohtml - HTML Dateien, die mit dem Programm pdftohtml erstellt "
"wurden
"
-#: /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 "- book-designer - HTML0 files from Book Designer
"
msgstr "- book-designer - HTML Dateien von Book Designer
"
-#: /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 +1365,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 +1373,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 +1381,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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
@@ -1371,30 +1451,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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
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/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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -1403,183 +1483,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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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,28 +1681,28 @@ msgstr ""
"\n"
+"\n"
""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1618,32 +1710,39 @@ msgstr ""
"Geben Sie an, wie der Autor dieses Buches sortiert werden soll. \"Charles "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " Sterne"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "&Etiketten hinzufügen: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Etiketten-Editor öffnen"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "Etiketten entfe&rnen:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
"Durch getrennte Liste der Etiketten, die von den Büchern entfernt werden. "
@@ -1674,50 +1773,45 @@ 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
-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 +1840,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Format"
@@ -1870,96 +1964,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+#~ ""
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ ""
+
+#: /home/kovid/work/calibre/src/calibre/__init__.py:133
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:170
msgid "Created by "
msgstr "Gemaakt door "
@@ -60,6 +98,10 @@ 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 "Schijf %s is niet gevonden. Probeer te herstarten."
+
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:355
+msgid "The reader has no storage card connected."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73
@@ -75,8 +117,14 @@ 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:174
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:314
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685
+#: /home/kovid/work/calibre/src/calibre/library/database.py:925
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1433
+#: /home/kovid/work/calibre/src/calibre/library/database.py:1563
msgid "Unknown"
msgstr "Onbekend"
@@ -99,7 +147,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:409
msgid "Publisher"
msgstr "Uitgeverij"
@@ -205,7 +253,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 +263,39 @@ 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 ""
+"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 ""
"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 "
@@ -241,7 +305,7 @@ msgstr ""
"0 betekent dat de links niet zullen worden gevolgd. Een negatieve waarde "
"betekent dat 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. tags whose href matches will be ignored. Defaults "
"to %default"
@@ -249,18 +313,15 @@ msgstr ""
"Een reguliere expressie. 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 "Vind niet automatisch nieuwe hoofdstukken."
+
+#: /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 +329,20 @@ 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 ""
+"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 ""
"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 +361,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 +381,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,39 +397,44 @@ 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 "
"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: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 +443,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 +518,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:943
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:981
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:996
msgid ""
"Could not process image: %s\n"
"%s"
@@ -496,14 +575,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:1743
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:1745
msgid ""
"Bad table:\n"
"%s"
@@ -511,11 +590,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:1767
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:1797
msgid ""
"You have to save the website %s as an html file first and then run html2lrf "
"on it."
@@ -523,19 +602,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:1839
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:1842
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:1976
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:1982
msgid ""
"Usage: %prog [options] mybook.html\n"
"\n"
@@ -614,11 +693,11 @@ msgstr "uitgebreide verwerking"
msgid "Convert LRS to LRS, useful for debugging."
msgstr "converteer LRS naar LRF, handig om fouten op te sporen."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:455
msgid "Invalid LRF file. Could not set metadata."
msgstr "Foutief LRF bestand. Metadata kan niet worden ingesteld."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:580
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -632,46 +711,46 @@ msgstr ""
"Weergave/wijzig de metadata in een LRF bestand\n"
"\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:587
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:21
msgid "Set the book title"
msgstr "Geef boek titel"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set sort key for the title"
msgstr "Geef sorteer sleutel voor de titel"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set the author"
msgstr "Geef de auteur"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set sort key for the author"
msgstr "Geef sorteer sleuter voor de auteur"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:25
msgid "The category this book belongs to. E.g.: History"
msgstr "De categorie waarin die boek behoord, bv: Geschiedenis"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr ""
"Pad naar de afbeelding die zal worden gebruikt als pictogram voor dit "
"bestand."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
"Pad naar een TXT bestand met daarin de opmerking die zal worden opgeslagen "
"in het LRF bestand."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
msgid "Extract thumbnail from LRF file"
msgstr "Lees pictogram uit LRF bestand"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -679,11 +758,11 @@ msgstr ""
"Lees de omslag uit LRF bestand. Het LRF bestands formaat heeft geen "
"gedefinieerde omslag, dus moeten we proberen deze te raden."
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set book ID"
msgstr "Geef boek ID"
-#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Don't know what this is for"
msgstr "Weet niet waar dit voor is"
@@ -767,11 +846,11 @@ msgstr ""
"\n"
"%prog converteert mijnboek.txt naar mijnboek.lrf"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:23
msgid "Set the authors"
msgstr "Geef de auteur"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:27
msgid "Set the comment"
msgstr "Geef de omschrijving"
@@ -854,11 +933,11 @@ msgstr ""
"Download een omslag afbeelding voor het boek geidentificeerd door ISBN via "
"LibraryThing.com\n"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:751
msgid "Usage: %s file.lit"
msgstr "Gebruik: %s bestand.lit"
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:758
msgid "Cover saved to"
msgstr "omslag weggeschreven naar"
@@ -870,19 +949,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:341
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:343
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:362
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:364
msgid "OEB ebook created in"
msgstr "OEB boek bemaakt in"
@@ -890,18 +969,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:275
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755
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:246
msgid "Comments"
msgstr "Opmerkingen"
@@ -920,82 +999,90 @@ msgstr "TekstLabel"
msgid "Choose Format"
msgstr "Kies Formaat"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
msgid "Basic"
msgstr "Eenvoudig"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:24
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:102
msgid "
Must be a directory."
msgstr "
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:102
msgid "Invalid database location "
msgstr "Foutieve database locatie "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:105
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:105
msgid "Invalid database location.
Cannot write to "
msgstr "Foutieve database locatie.
Kan niet schrijven naar "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:117
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:117
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/dialogs/config_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265
msgid "Configuration"
msgstr "Configuratie"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
msgid "&Location of books database (library1.db)"
msgstr "&Locatie van boek database )library1.db)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
msgid "Browse for the new database location"
msgstr "Blader naar de nieuwe database locatie"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py: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/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:223
+#: /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/metadata_single_ui.py:293
#: /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/user_profiles_ui.py:226
+#: /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:229
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
msgid "Use &Roman numerals for series number"
msgstr "Gebruik &Romeinse nummers voor de series"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
+msgid "Format for &single file save:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
+msgid "&Priority for conversion jobs:"
+msgstr "&Prioriteit van conversie batch"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209
msgid "Default network &timeout:"
msgstr "Standaard netwerk &timeout:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
@@ -1003,63 +1090,59 @@ msgstr ""
"Geef de standaard timeout voor netwerk downloads. (bv. wanneer we informatie "
"van het Internet moeten halen)"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211
msgid " seconds"
msgstr " seconden"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206
-msgid "&Priority for conversion jobs:"
-msgstr "&Prioriteit van conversie batch"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207
-msgid "Frequently used directories"
-msgstr "Vaak gebruikte folders"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208
-msgid "Add a directory to the frequently used directories list"
-msgstr "Voeg een folder toe aan de lijst met vaak gebruikte folders"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210
-msgid "Remove a directory from the frequently used directories list"
-msgstr "Verwijder een folder van de lijst met vaak gebruikte folders"
-
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212
-msgid "Select visible &columns in library view"
-msgstr "Selecteer zichtbare &kolommen in bibliotheek weergave"
-
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Toolbar"
msgstr "Werkbalk"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213
msgid "Large"
msgstr "Groot"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214
msgid "Medium"
msgstr "Middel"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215
msgid "Small"
msgstr "Klein"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216
msgid "&Button size in toolbar"
msgstr "&Knop grootte in werkbalk"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217
msgid "Show &text in toolbar buttons"
msgstr "Laat &tekst zien in werkbalk knoppen"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218
+msgid "Select visible &columns in library view"
+msgstr "Selecteer zichtbare &kolommen in bibliotheek weergave"
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219
+msgid "Frequently used directories"
+msgstr "Vaak gebruikte folders"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+msgid "Add a directory to the frequently used directories list"
+msgstr "Voeg een folder toe aan de lijst met vaak gebruikte folders"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:222
+msgid "Remove a directory from the frequently used directories list"
+msgstr "Verwijder een folder van de lijst met vaak gebruikte folders"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:224
msgid "Free unused diskspace from the database"
msgstr "Geef ongebruikte diskruimte uit de database terug"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:225
msgid "&Compact database"
msgstr "&Comprimeer database"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:226
msgid "&Metadata from file name"
msgstr "&Metadata van bestands naam"
@@ -1068,9 +1151,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:280
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:756
msgid "Author(s)"
msgstr "Auteur(s)"
@@ -1082,19 +1165,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 "Fout bij ophalen metadata"
+
+#: /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 +1205,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 "&Toegangs Sleutel:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81
msgid "Fetch"
@@ -1136,7 +1223,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 +1231,10 @@ msgstr "Opdracht details"
msgid "Unavailable"
msgstr "Niet beschikbaar"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38
+msgid " - Jobs"
+msgstr " - Taken"
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38
msgid "Active Jobs"
msgstr "Actieve opdrachten"
@@ -1152,73 +1243,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:177
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 "There was an error reading from file:
"
msgstr "
Er is een fout opgetreden bij het lezen van bestand:
"
-#: /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 +1318,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 "
- baen - Books from BAEN Publishers
"
msgstr "- baen - Boeken van BAEN Uitgeverijen
"
-#: /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 ""
"- pdftohtml - HTML files that are the output of the program "
"pdftohtml
"
@@ -1239,11 +1330,11 @@ msgstr ""
"- pdftohtml - HTML bestanden die zijn gegenereerd door "
"pdftohtml
"
-#: /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 "- book-designer - HTML0 files from Book Designer
"
msgstr "- book-designer - HTML0 bestanden van Book Designer
"
-#: /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."
@@ -1251,7 +1342,7 @@ msgstr ""
"Geef metadata zoals de titel en auteur van het boek.
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 +1350,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 +1358,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 "No help available"
msgstr "Help is niet beschikbaar"
-#: /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/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/lrf_single_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260
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/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/lrf_single_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
@@ -1337,30 +1428,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/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/lrf_single_ui.py:521
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268
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/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/lrf_single_ui.py:522
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269
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/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/lrf_single_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -1369,183 +1460,197 @@ msgstr ""
"zoeken.
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/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/lrf_single_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274
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/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/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:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276
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
CSS"
msgstr "Negeer
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 ""
+"&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 "&Multiplier van tekst grootte in gegenereerde tabellen:"
+
+#: /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 "Detecteer hoofdstuk bij t&ag:"
+
+#: /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 ""
"\n"
"
\n"
+"\n"
""
@@ -1555,28 +1660,28 @@ msgstr ""
"\n"
+"\n"
""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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."
@@ -1584,32 +1689,39 @@ msgstr ""
"Geef aan hoe de auteur(s) van dit boeken dienen te worden gesorteerd. "
"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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
msgid " stars"
msgstr " sterren"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr "Voeg Ta&gs Toe: "
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr "Open Tag Editor"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr "&Verwijder tags:"
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
"Lijst van tags die moeten worden verwijderd, gescheiden met komma's. "
@@ -1640,51 +1752,46 @@ 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
-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 +1820,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr "Formaat"
@@ -1833,98 +1940,98 @@ 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: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:214
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 "Could not create recipe. Error:
%s"
msgstr "
Een recept kon niet worden aangemaakt. Foutmelding:
%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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+"\n"
""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
@@ -1422,49 +1532,44 @@ 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
-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 +1598,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr ""
@@ -1607,95 +1712,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+"\n"
""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
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_bulk_ui.py:115
+#: /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_bulk_ui.py:118
+#: /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_bulk_ui.py:119
+#: /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_bulk_ui.py:120
+#: /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_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
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_bulk_ui.py:123
+#: /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
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
msgid "Add Ta&gs: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
msgid "&Remove tags:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
@@ -1422,49 +1482,44 @@ 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
-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 +1548,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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
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:689
msgid "Format"
msgstr ""
@@ -1607,95 +1662,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:214
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:208
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:209
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:210
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:211
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:212
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:213
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:215
msgid ""
"
\n"
+""
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114
+msgid "Edit Meta information"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257
+msgid "Meta information"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262
+msgid "Author S&ort: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263
+msgid ""
+"Specify how the author(s) of this book should be sorted. For example Charles "
+"Dickens should be sorted as Dickens, Charles."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264
+msgid "&Rating:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266
+msgid "Rating of this book. 0-5 stars"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267
+msgid " stars"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126
+msgid "Add Ta&gs: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273
+msgid "Open Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:130
+msgid "&Remove tags:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:131
+msgid "Comma separated list of tags to remove from the books. "
+msgstr ""
+
+#: /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: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:251
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:411
+msgid "Series"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:689
+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:73
+msgid "Advanced Search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74
+msgid "Match a&ll of the following criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75
+msgid "Match a&ny of the following criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76
+msgid "Search criteria"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77
+msgid "More"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78
+msgid "Fewer"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123
+msgid "Tag Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124
+msgid "A&vailable tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125
+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
+msgid "Apply tag to current book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129
+msgid "A&pplied tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130
+msgid "Unapply (remove) tag from current book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132
+msgid "&Add tag:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133
+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
+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:214
+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:208
+msgid "Add custom news source"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209
+msgid "Available user recipes"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210
+msgid "Add/Update &recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211
+msgid "&Remove recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212
+msgid "&Share recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213
+msgid "&Load recipe from file"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215
+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:219
+msgid "Recipe &title:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220
+msgid "&Oldest article:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221
+msgid "The oldest article to download"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222
+msgid " days"
+msgstr " రోజులు"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223
+msgid "&Max. number of articles per feed:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224
+msgid "Maximum number of articles to download per feed."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225
+msgid "Feeds in recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227
+msgid "Remove feed from recipe"
+msgstr ""
+
+#: /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:233
+msgid "Add feed to recipe"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231
+msgid "&Feed title:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232
+msgid "Feed &URL:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234
+msgid "&Add feed"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235
+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:236
+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)"
+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)"
+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)"
+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
+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/library.py:235
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:245
+msgid "None"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:236
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:410
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:695
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:759
+msgid "Tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242
+msgid "Formats"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:251
+msgid "Book %s of %s."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396
+msgid "Double click to edit me
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:757
+msgid "Size (MB)"
+msgstr "పరిమాణం (మెబై)"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:758
+msgid "Date"
+msgstr "తేదీ"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:408
+msgid "Rating"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690
+msgid "Path"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:694
+msgid "Timestamp"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/library.py:794
+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 "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 "No matches for the search phrase %s 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:82
+msgid "Error communicating with device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95
+msgid ""
+"For help visit %s.kovidgoyal.net
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96
+msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116
+msgid "Send to main memory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117
+msgid "Send to storage card"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117
+msgid "and delete from library"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119
+msgid "Send to storage card by default"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:131
+msgid "Edit metadata individually"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132
+msgid "Edit metadata in bulk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135
+msgid "Add books from a single directory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136
+msgid ""
+"Add books recursively (One book per directory, assumes every ebook file is "
+"the same book in a different format)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137
+msgid ""
+"Add books recursively (Multiple books per directory, assumes every ebook "
+"file is a different book)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275
+msgid "Save to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153
+msgid "Save to disk in a single directory"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154
+msgid "Save only %s format to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281
+msgid "View"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158
+msgid "View specific format"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174
+msgid "Convert individually"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175
+msgid "Bulk convert"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309
+msgid " detected."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309
+msgid "Device: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:334
+msgid "Connected "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:346
+msgid "Device database corrupted"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:347
+msgid ""
+"\n"
+" The database of books on the reader is corrupted. Try the "
+"following:\n"
+"
\n"
+" - 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.
\n"
+" - 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.
\n"
+"
\n"
+" "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:399
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:473
+msgid ""
+"Books with the same title as the following already exist in the database. "
+"Add them anyway?
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:402
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:476
+msgid "Duplicates found!"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:435
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:448
+msgid "Uploading books to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:507
+msgid "No space on device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:508
+msgid ""
+"Cannot upload books to device there is no more free space available "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:546
+msgid "Deleting books from device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599
+msgid "Cannot edit metadata"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:599
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834
+msgid "No books selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:674
+msgid "Sending books to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:677
+msgid "No suitable formats"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:678
+msgid ""
+"Could not upload the following books to the device, as no suitable formats "
+"were found:
%s
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
+msgid "Cannot save to disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:705
+msgid ""
+"Could not save the following books to disk, because the %s format is not "
+"available for them:
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:709
+msgid "Could not save some ebooks"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:742
+msgid "Fetch news from "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:744
+msgid "Fetching news from "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:754
+msgid "News fetched. Uploading to device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:764
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834
+msgid "Cannot convert"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773
+msgid "Starting Bulk conversion of %d books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923
+msgid "No book selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:905
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:937
+msgid "Cannot view"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942
+msgid "Choose the format to view"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938
+msgid "%s has no available formats."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
+msgid "Cannot configure"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
+msgid "Cannot configure while there are running jobs."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:999
+msgid "Copying database to "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1014
+msgid "Invalid database"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1015
+msgid ""
+"An invalid database already exists at %s, delete it before trying to move "
+"the existing database.
Error: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1023
+msgid "Could not move database"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1044
+msgid "No detailed info available"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1045
+msgid "No detailed information is available for books on the device."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1087
+msgid "Error talking to device"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1088
+msgid ""
+"There was a temporary error talking to the device. Please unplug and "
+"reconnect the device and or reboot."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1139
+msgid "Conversion Error"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158
+msgid "Database does not exist"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1158
+msgid ""
+"The directory in which the database should be: %s no longer exists. Please "
+"choose a new database location."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1209
+msgid ""
+"Latest version: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215
+msgid ""
+"%s has been updated to version %s. See the new features. "
+"Visit the download page?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1215
+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
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
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:52
+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 ""
+"
Please enter your username and password for %s
If you do not have one, "
+"please subscribe to get access to the articles.
Click OK to proceed."
+msgstr ""
+
+#: /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 ""
+"
Browsing books by their covers is disabled.
Import of pictureflow "
+"module failed:
"
+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:698
+msgid "Untitled Article"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:744
+msgid ""
+"\n"
+"Downloaded article %s from %s\n"
+"%s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:750
+msgid "Article downloaded: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:756
+msgid "Failed to download article: %s from %s\n"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:761
+msgid "Article download failed: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:776
+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 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/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 @@
'''
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 @@
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 @@ class FcValue(Structure):
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)
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
+
+
+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)
+
+>>> print doc
+Some text and a link.
+
+If an attribute name collides with a Python keyword, simply append an underscore
+to the name:
+
+>>> doc(class_='intro')
+
+>>> print doc
+Some text and a link.
+
+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
+
+>>> print stream
+Some text and a link.
+
+
+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
+
+>>> print fragment
+Hello, world!
+"""
+
+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')
+
+
+ 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)
+
+ >>> print Element('span', title='1 < 2')
+
+ >>> print Element('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)
+
+
+ Attribute names that conflict with Python keywords can be specified by
+ appending an underscore:
+
+ >>> print Element('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'))
+
+ >>> print Element('a')('Label')
+ Label
+ >>> print Element('a')('Label', href="target")
+ Label
+
+ 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')
+ Hello world
+ >>> print Element('em')(42)
+ 42
+ >>> print Element('em')('1 < 2')
+ 1 < 2
+
+ This technique also allows mixed content:
+
+ >>> print Element('p')('Hello ', Element('b')('world'))
+ Hello world
+
+ Quotes are not escaped inside text nodes:
+ >>> print Element('p')('"Hello"')
+ "Hello"
+
+ 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')
+
some text
+
+ 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')
+
+ """
+ __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
+
+ >>> print factory.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, world!
+
+ A factory can also be bound to a specific namespace:
+
+ >>> factory = ElementFactory('http://www.w3.org/1999/xhtml')
+ >>> print factory.html(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))
+
+
+ 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('''Hello, world!
''')
+ >>> print html
+ Hello, world!
+
+ 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
+ Hello, world!
+
+ 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
+ HELLO, WORLD!
+
+ 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('foo bar ')
+ >>> print stream.select('elem')
+ foo bar
+ >>> 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')
+
+
+ You can use the "." expression to match the context node itself
+ (although that usually makes little sense):
+
+ >>> print stream.select('.')
+ foo bar
+
+ :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"')
+
+
+ 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)
+
+
+ :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
+
+ >>> 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 '' % 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('''''')
+ >>> filler = HTMLFormFiller(data={'foo': 'bar'})
+ >>> print html | filler
+
+ """
+ # 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('')
+ >>> print html | HTMLSanitizer()
+
+
+ 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('')
+ >>> sanitizer = HTMLSanitizer(safe_attrs=HTMLSanitizer.SAFE_ATTRS | set(['style']))
+ >>> print html | sanitizer
+
+
+ Note that even in this case, the filter *does* attempt to remove dangerous
+ constructs from style attributes:
+
+ >>> html = HTML('')
+ >>> print html | sanitizer
+
+
+ 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('''
+ ...
+ ... 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 ```` of the input document:
+
+>>> from genshi.builder import tag
+>>> html = HTML('''
+... 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 `` `` element and paste the
+ copied text into the body as ```` enclosed text:
+
+ >>> buffer = StreamBuffer()
+ >>> print html | Transformer('head/title/text()').copy(buffer) \\
+ ... .end().select('body').prepend(tag.h1(buffer))
+ 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 Title Some 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 Title Some
+ 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 Title Some
+ 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 Title Some 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 Title Some
+ 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 Title Some 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 Title Some 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 Title Some 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 Title Some 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 Title Some 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 Title Some body
+ text.
+
+ Otherwise the attribute will be set to `value`:
+
+ >>> print html | Transformer('body/em').attr('class', 'emphasis')
+ Some Title Some 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 Title Some 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 Title Some 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 Title Some
+ 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)
+ one two Some 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 TITLE Some 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('Foo Bar ')
+ >>> print xml
+ Foo Bar
+ >>> print xml.select('elem')
+ Foo Bar
+ >>> 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('%s>' % 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('%s %s?>' % 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('>%s>' % tag)
+ else:
+ buf.append('>')
+ yield Markup(u''.join(buf))
+
+ elif kind is END:
+ yield Markup('%s>' % 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('%s %s?>' % 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('%s>' % tag)
+ yield Markup(u''.join(buf))
+ if tag in noescape_elems:
+ noescape = True
+
+ elif kind is END:
+ yield Markup('%s>' % 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('%s %s?>' % 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 ``