diff --git a/linux_installer.py b/linux_installer.py index 315b2d8486..e30e2bbeca 100644 --- a/linux_installer.py +++ b/linux_installer.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' ''' Create linux binary. ''' -import glob, sys, subprocess, tarfile, os, re +import glob, sys, subprocess, tarfile, os, re, py_compile HOME = '/home/kovid' PYINSTALLER = os.path.expanduser('~/build/pyinstaller') CALIBREPREFIX = '___' @@ -30,7 +30,7 @@ def run_pyinstaller(args=sys.argv): subprocess.check_call('make plugins', shell=True) cp = HOME+'/build/'+os.path.basename(os.getcwd()) spec = open(os.path.join(PYINSTALLER, 'calibre', 'calibre.spec'), 'wb') - raw = re.sub(r'CALIBREPREFIX\s+=\s+\'___\'', 'CALIBREPREFIX = '+repr(cp), + raw = re.sub(r'CALIBREPREFIX\s+=\s+\'___\'', 'CALIBREPREFIX = '+repr(cp), open(__file__).read()) spec.write(raw) spec.close() @@ -64,17 +64,19 @@ temp = ['keyword', 'codeop'] recipes = ['calibre', 'web', 'feeds', 'recipes'] prefix = '.'.join(recipes)+'.' +recipes_toc = [] +extra_toc = [ + ('keyword', '/usr/lib/python2.5/keyword.pyo', 'PYSOURCE'), + ('codeop', '/usr/lib/python2.5/codeop.pyo', 'PYSOURCE') + ] for f in glob.glob(os.path.join(CALIBRESRC, *(recipes+['*.py']))): - temp.append(prefix + os.path.basename(f).partition('.')[0]) -hook = os.path.expanduser('~/temp/hook-calibre.py') -f = open(hook, 'wb') -hook_script = 'hiddenimports = %s'%repr(temp) -f.write(hook_script) + py_compile.compile(f, doraise=True) + recipes_toc.append((prefix + os.path.basename(f).partition('.')[0], f+'o', 'PYSOURCE')) sys.path.insert(0, CALIBRESRC) from calibre.linux import entry_points -executables, scripts = ['calibre_postinstall', 'parallel'], \ +executables, scripts = ['calibre_postinstall', 'calibre-parallel'], \ [os.path.join(CALIBRESRC, 'calibre', 'linux.py'), os.path.join(CALIBRESRC, 'calibre', 'parallel.py')] for entry in entry_points['console_scripts'] + entry_points['gui_scripts']: @@ -82,18 +84,19 @@ for entry in entry_points['console_scripts'] + entry_points['gui_scripts']: executables.append(fields[0].strip()) scripts.append(os.path.join(CALIBRESRC, *map(lambda x: x.strip(), fields[1].split(':')[0].split('.')))+'.py') -recipes = Analysis(glob.glob(os.path.join(CALIBRESRC, 'calibre', 'web', 'feeds', 'recipes', '*.py')), - pathex=[CALIBRESRC], hookspath=[os.path.dirname(hook)], excludes=excludes) analyses = [Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), loader, script], pathex=[PYINSTALLER, CALIBRESRC, CALIBREPLUGINS], excludes=excludes) for script in scripts] pyz = TOC() binaries = TOC() +pyz += extra_toc +pyz += recipes_toc + for a in analyses: pyz = a.pure + pyz binaries = a.binaries + binaries -pyz = PYZ(pyz + recipes.pure, name='library.pyz') +pyz = PYZ(pyz, name='library.pyz') built_executables = [] for script, exe, a in zip(scripts, executables, analyses): diff --git a/osx_installer.py b/osx_installer.py index cccb46ad93..c092650de6 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -39,6 +39,7 @@ print >>loader, '%(function)s()' loader.close() os.chmod(loader_path, 0700) os.environ['PYTHONHOME'] = resources_dir +os.environ['FC_CONFIG_DIR'] = os.path.join(resources_dir, 'fonts') os.execv(loader_path, sys.argv) ''' CHECK_SYMLINKS_PRESCRIPT = \ @@ -240,13 +241,18 @@ _check_symlinks_prescript() print 'Adding plugins' module_dir = os.path.join(resource_dir, 'lib', 'python2.5', 'lib-dynload') print 'Adding fontconfig' - for f in glob.glob(os.path.expanduser('~/fontconfig/*')): + for f in glob.glob(os.path.expanduser('~/fontconfig2/*')): os.link(f, os.path.join(frameworks_dir, os.path.basename(f))) for src, dest in plugin_files: if 'dylib' in dest: os.link(src, os.path.join(frameworks_dir, dest)) else: os.link(src, os.path.join(module_dir, dest)) + dst = os.path.join(resource_dir, 'fonts') + if os.path.exists(dst): + shutil.rmtree(dst) + shutil.copytree('/usr/local/etc/fonts', dst, symlinks=False) + print print 'Adding IPython' dst = os.path.join(resource_dir, 'lib', 'python2.5', 'IPython') @@ -271,15 +277,15 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), ' f.write(src) f.close() print - print 'Adding GUI main.py' + print 'Adding 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 'Building disk image' BuildAPP.makedmg(os.path.join(self.dist_dir, APPNAME+'.app'), APPNAME+'-'+VERSION) - def main(): sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) sys.argv[1:2] = ['py2app'] @@ -294,11 +300,12 @@ def main(): 'argv_emulation' : True, 'iconfile' : 'icons/library.icns', 'frameworks': ['libusb.dylib', 'libunrar.dylib'], - 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', - 'PyQt4.QtSvg', - 'mechanize', 'ClientForm', 'usbobserver', + 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', + 'PyQt4.QtSvg', 'PyQt4.QtWebKit', + '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.''' @@ -308,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 @@ print 'Setup', APPNAME, 'version:', VERSION epsrc = re.compile(r'entry_points = (\{.*?\})', re.DOTALL).search(open('src/%s/linux.py'%APPNAME, 'rb').read()).group(1) entry_points = eval(epsrc, {'__appname__': APPNAME}) -if 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower(): - entry_points['console_scripts'].append('parallel = %s.parallel:main'%APPNAME) - def _ep_to_script(ep, base='src'): return (base+os.path.sep+re.search(r'.*=\s*(.*?):', ep).group(1).replace('.', '/')+'.py').strip() diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 12eeb2f625..721d93dcfd 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.72' +__version__ = '0.4.76' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' @@ -38,6 +38,40 @@ try: except: preferred_encoding = 'utf-8' +_abspath = os.path.abspath +def my_abspath(path, encoding=sys.getfilesystemencoding()): + ''' + Work around for buggy os.path.abspath. This function accepts either byte strings, + in which it calls os.path.abspath, or unicode string, in which case it first converts + to byte strings using `encoding`, calls abspath and then decodes back to unicode. + ''' + to_unicode = False + if isinstance(path, unicode): + path = path.encode(encoding) + to_unicode = True + res = _abspath(path) + if to_unicode: + res = res.decode(encoding) + return res + +os.path.abspath = my_abspath +_join = os.path.join +def my_join(a, *p): + encoding=sys.getfilesystemencoding() + p = [a] + list(p) + _unicode = False + for i in p: + if isinstance(i, unicode): + _unicode = True + break + p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p] + + res = _join(*p) + if _unicode: + res = res.decode(encoding) + return res + +os.path.join = my_join def osx_version(): if isosx: @@ -75,6 +109,8 @@ class ColoredFormatter(Formatter): def setup_cli_handlers(logger, level): + if os.environ.get('CALIBRE_WORKER', None) is not None and logger.handlers: + return logger.setLevel(level) if level == logging.WARNING: handler = logging.StreamHandler(sys.stdout) @@ -88,6 +124,7 @@ def setup_cli_handlers(logger, level): handler = logging.StreamHandler(sys.stderr) handler.setLevel(logging.DEBUG) handler.setFormatter(logging.Formatter('[%(levelname)s] %(filename)s:%(lineno)s: %(message)s')) + logger.addHandler(handler) class CustomHelpFormatter(IndentedHelpFormatter): @@ -361,9 +398,10 @@ def relpath(target, base=os.curdir): Base can be a directory specified either as absolute or relative to current dir. """ - if not os.path.exists(target): - raise OSError, 'Target does not exist: '+target - + #if not os.path.exists(target): + # raise OSError, 'Target does not exist: '+target + if target == base: + raise ValueError('target and base are both: %s'%target) if not os.path.isdir(base): raise OSError, 'Base is not a directory or does not exist: '+base @@ -371,13 +409,13 @@ def relpath(target, base=os.curdir): target_list = (os.path.abspath(target)).split(os.sep) # On the windows platform the target may be on a completely different drive from the base. - if iswindows and base_list[0] <> target_list[0]: - raise OSError, 'Target is on a different drive to base. Target: '+target_list[0].upper()+', base: '+base_list[0].upper() + if iswindows and base_list[0].upper() != target_list[0].upper(): + raise OSError, 'Target is on a different drive to base. Target: '+repr(target)+', base: '+repr(base) # Starting from the filepath root, work out how much of the filepath is # shared by base and target. for i in range(min(len(base_list), len(target_list))): - if base_list[i] <> target_list[i]: break + if base_list[i] != target_list[i]: break else: # If we broke out of the loop, i is pointing to the first differing path elements. # If we didn't break out of the loop, i is pointing to identical path elements. diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 0050e091d3..bbfbdf037c 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -351,11 +351,20 @@ class PRS505(Device): os.utime(path, None) def upload_books(self, files, names, on_card=False, end_session=True): + if on_card and not self._card_prefix: + raise ValueError(_('The reader has no storage card connected.')) path = os.path.join(self._card_prefix, self.CARD_PATH_PREFIX) if on_card \ else os.path.join(self._main_prefix, 'database', 'media', 'books') - infiles = [file if hasattr(file, 'read') else open(file, 'rb') for file in files] - for f in infiles: f.seek(0, 2) - sizes = [f.tell() for f in infiles] + + def get_size(obj): + if hasattr(obj, 'seek'): + obj.seek(0, 2) + size = obj.tell() + obj.seek(0) + return size + return os.path.getsize(obj) + + sizes = map(get_size, files) size = sum(sizes) space = self.free_space() mspace = space[0] @@ -370,13 +379,18 @@ class PRS505(Device): paths, ctimes = [], [] names = iter(names) - for infile in infiles: + for infile in files: + close = False + if not hasattr(infile, 'read'): + infile, close = open(infile, 'rb'), True infile.seek(0) name = names.next() paths.append(os.path.join(path, name)) if not os.path.exists(os.path.dirname(paths[-1])): os.makedirs(os.path.dirname(paths[-1])) self.put_file(infile, paths[-1], replace_file=True) + if close: + infile.close() ctimes.append(os.path.getctime(paths[-1])) return zip(paths, sizes, ctimes, cycle([on_card])) diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 61153bdc8d..dd7e8fc96a 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -15,6 +15,6 @@ class ConversionError(Exception): class UnknownFormatError(Exception): pass -BOOK_EXTENSIONS = ['lrf', 'lrx', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm', +BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm', 'html', 'xhtml', 'epub', 'pdf', 'prc', 'mobi', 'azw', - 'epub', 'fb2', 'djvu'] + 'epub', 'fb2', 'djvu', 'lrx'] diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py index 02882312a8..6b724fd008 100644 --- a/src/calibre/ebooks/lrf/__init__.py +++ b/src/calibre/ebooks/lrf/__init__.py @@ -9,8 +9,6 @@ from optparse import OptionValueError from htmlentitydefs import name2codepoint from uuid import uuid4 -from fontTools.ttLib import TTLibError - from calibre.ebooks.lrf.pylrs.pylrs import Book as _Book from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Header, PutObj, \ Paragraph, TextStyle, BlockStyle @@ -120,7 +118,6 @@ def option_parser(usage, gui_mode=False): dest='font_delta') laf.add_option('--ignore-colors', action='store_true', default=False, dest='ignore_colors', help=_('Render all content as black on white instead of the colors specified by the HTML or CSS.')) - page = parser.add_option_group('PAGE OPTIONS') profiles = profile_map.keys() @@ -139,6 +136,11 @@ def option_parser(usage, gui_mode=False): help=_('''Top margin of page. Default is %default px.''')) page.add_option('--bottom-margin', default=0, dest='bottom_margin', type='int', help=_('''Bottom margin of page. Default is %default px.''')) + page.add_option('--render-tables-as-images', default=False, action='store_true', + help=_('Render tables in the HTML as images (useful if the document has large or complex tables)')) + page.add_option('--text-size-multiplier-for-rendered-tables', type='float', default=1.0, + help=_('Multiply the size of text in rendered tables by this factor. Default is %default')) + link = parser.add_option_group('LINK PROCESSING OPTIONS') link.add_option('--link-levels', action='store', type='int', default=sys.maxint, \ dest='link_levels', @@ -154,12 +156,13 @@ def option_parser(usage, gui_mode=False): chapter = parser.add_option_group('CHAPTER OPTIONS') chapter.add_option('--disable-chapter-detection', action='store_true', default=False, dest='disable_chapter_detection', - help=_('''Prevent the automatic insertion of page breaks''' - ''' before detected chapters.''')) + help=_('''Prevent the automatic detection chapters.''')) chapter.add_option('--chapter-regex', dest='chapter_regex', default='chapter|book|appendix', help=_('''The regular expression used to detect chapter titles.''' - ''' It is searched for in heading tags (h1-h6). Defaults to %default''')) + ''' It is searched for in heading tags (h1-h6). Defaults to %default''')) + chapter.add_option('--chapter-attr', default='$,,$', + help=_('Detect a chapter beginning at an element having the specified attribute. The format for this option is tagname regexp,attribute name,attribute value regexp. For example to match all heading tags that have the attribute class="chapter" you would use "h\d,class,chapter". Default is %default''')) chapter.add_option('--page-break-before-tag', dest='page_break', default='h[12]', help=_('''If html2lrf does not find any page breaks in the ''' '''html file and cannot detect chapter headings, it will ''' diff --git a/src/calibre/ebooks/lrf/any/convert_from.py b/src/calibre/ebooks/lrf/any/convert_from.py index 4142c71c55..c0a1a6500c 100644 --- a/src/calibre/ebooks/lrf/any/convert_from.py +++ b/src/calibre/ebooks/lrf/any/convert_from.py @@ -66,7 +66,7 @@ def traverse_subdirs(tdir): return tdir def handle_archive(path): - tdir = tempfile.mkdtemp(prefix=__appname__+'_') + tdir = tempfile.mkdtemp(prefix=__appname__+'_'+'archive_') extract(path, tdir) files = [] cdir = traverse_subdirs(tdir) @@ -75,9 +75,10 @@ def handle_archive(path): pat = os.path.join(cdir, '*.'+ext) files.extend(glob.glob(pat)) file = largest_file(files) - if file: - return tdir, file - file = find_htmlfile(cdir) + if not file: + file = find_htmlfile(cdir) + if isinstance(file, str): + file = file.decode(sys.getfilesystemencoding()) return tdir, file def process_file(path, options, logger=None): @@ -109,7 +110,7 @@ def process_file(path, options, logger=None): if not newpath: raise UnknownFormatError('Could not find ebook in archive') path = newpath - logger.info('Found ebook in archive: %s', path) + logger.info('Found ebook in archive: %s', repr(path)) try: ext = os.path.splitext(path)[1][1:].lower() convertor = None @@ -158,7 +159,10 @@ def main(args=sys.argv, logger=None, gui_mode=False): print _('No file to convert specified.') return 1 - return process_file(args[1], options, logger) + src = args[1] + if not isinstance(src, unicode): + src = src.decode(sys.getfilesystemencoding()) + return process_file(src, options, logger) if __name__ == '__main__': sys.exit(main()) diff --git a/src/calibre/ebooks/lrf/epub/convert_from.py b/src/calibre/ebooks/lrf/epub/convert_from.py index 4dc531f86b..701681243e 100644 --- a/src/calibre/ebooks/lrf/epub/convert_from.py +++ b/src/calibre/ebooks/lrf/epub/convert_from.py @@ -29,7 +29,7 @@ def generate_html(pathtoepub, logger): zip_extract(pathtoepub, tdir) except: if os.path.exists(tdir) and os.path.isdir(tdir): - shutil.rmtree(tdir) + shutil.rmtree(tdir) raise ConversionError, '.epub extraction failed' return tdir @@ -42,7 +42,7 @@ def process_file(path, options, logger=None): tdir = generate_html(epub, logger) try: ocf = OCFDirReader(tdir) - htmlfile = ocf.opf.spine.items().next().href + htmlfile = ocf.opf.spine[0].path options.opf = os.path.join(tdir, ocf.container[OPF.MIMETYPE]) if not options.output: ext = '.lrs' if options.lrs else '.lrf' @@ -61,7 +61,7 @@ def process_file(path, options, logger=None): def main(args=sys.argv, logger=None): parser = option_parser() options, args = parser.parse_args(args) - if len(args) != 2: + if len(args) != 2: parser.print_help() print print 'No epub file specified' diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 10a7137f34..15eede6d6c 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -30,7 +30,7 @@ from calibre.ebooks.lrf import option_parser as lrf_option_parser from calibre.ebooks import ConversionError from calibre.ebooks.lrf.html.table import Table from calibre import filename_to_utf8, setup_cli_handlers, __appname__, \ - fit_image, LoggingInterface + fit_image, LoggingInterface, preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.opf import OPFReader from calibre.devices.interface import Device @@ -242,6 +242,7 @@ class HTMLConverter(object, LoggingInterface): self.override_css = {} self.override_pcss = {} + self.table_render_job_server = None if self._override_css is not None: if os.access(self._override_css, os.R_OK): @@ -260,38 +261,43 @@ class HTMLConverter(object, LoggingInterface): paths = [os.path.abspath(path) for path in paths] + paths = [path.decode(sys.getfilesystemencoding()) if not isinstance(path, unicode) else path for path in paths] - while len(paths) > 0 and self.link_level <= self.link_levels: - for path in paths: - if path in self.processed_files: - continue - try: - self.add_file(path) - except KeyboardInterrupt: - raise - except: - if self.link_level == 0: # Die on errors in the first level + try: + while len(paths) > 0 and self.link_level <= self.link_levels: + for path in paths: + if path in self.processed_files: + continue + try: + self.add_file(path) + except KeyboardInterrupt: raise - for link in self.links: - if link['path'] == path: - self.links.remove(link) - break - self.log_warn('Could not process '+path) - if self.verbose: - self.log_exception(' ') - self.links = self.process_links() - self.link_level += 1 - paths = [link['path'] for link in self.links] - - if self.current_page is not None and self.current_page.has_text(): - self.book.append(self.current_page) - - for text, tb in self.extra_toc_entries: - self.book.addTocEntry(text, tb) - - if self.base_font_size > 0: - self.log_info('\tRationalizing font sizes...') - self.book.rationalize_font_sizes(self.base_font_size) + except: + if self.link_level == 0: # Die on errors in the first level + raise + for link in self.links: + if link['path'] == path: + self.links.remove(link) + break + self.log_warn('Could not process '+path) + if self.verbose: + self.log_exception(' ') + self.links = self.process_links() + self.link_level += 1 + paths = [link['path'] for link in self.links] + + if self.current_page is not None and self.current_page.has_text(): + self.book.append(self.current_page) + + for text, tb in self.extra_toc_entries: + self.book.addTocEntry(text, tb) + + if self.base_font_size > 0: + self.log_info('\tRationalizing font sizes...') + self.book.rationalize_font_sizes(self.base_font_size) + finally: + if self.table_render_job_server is not None: + self.table_render_job_server.killall() def is_baen(self, soup): return bool(soup.find('meta', attrs={'name':'Publisher', @@ -362,9 +368,10 @@ class HTMLConverter(object, LoggingInterface): else: self.css[selector] = self.override_css[selector] - self.file_name = os.path.basename(path) - self.log_info(_('Processing %s'), path if self.verbose else self.file_name) - upath = path.encode('utf-8') if isinstance(path, unicode) else path + upath = path.encode(sys.getfilesystemencoding()) if isinstance(path, unicode) else path + self.file_name = os.path.basename(upath.decode(sys.getfilesystemencoding())) + self.log_info(_('Processing %s'), repr(upath) if self.verbose else repr(self.file_name)) + if not os.path.exists(upath): upath = upath.replace('&', '%26') #convertlit replaces & with %26 in file names f = open(upath, 'rb') @@ -380,10 +387,13 @@ class HTMLConverter(object, LoggingInterface): self.log_info(_('\tConverting to BBeB...')) self.current_style = {} self.page_break_found = False + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) self.target_prefix = path self.previous_text = '\n' self.tops[path] = self.parse_file(soup) - self.processed_files.append(path) + self.processed_files.append(path) + def parse_css(self, style): @@ -494,7 +504,9 @@ class HTMLConverter(object, LoggingInterface): top = self.current_block self.current_block.must_append = True + self.soup = soup self.process_children(soup, {}, {}) + self.soup = None if self.current_para and self.current_block: self.current_para.append_to(self.current_block) @@ -625,6 +637,8 @@ class HTMLConverter(object, LoggingInterface): para, text, path, fragment = link['para'], link['text'], link['path'], link['fragment'] ascii_text = text + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) if path in self.processed_files: if path+fragment in self.targets.keys(): tb = get_target_block(path+fragment, self.targets) @@ -857,11 +871,12 @@ class HTMLConverter(object, LoggingInterface): append_text(src) else: srcs = src.split('\n') - for src in srcs: - if src: - append_text(src) - if len(srcs) > 1: - self.line_break() + for src in srcs[:-1]: + append_text(src) + self.line_break() + last = srcs[-1] + if len(last): + append_text(last) def line_break(self): self.current_para.append(CR()) @@ -1424,6 +1439,18 @@ class HTMLConverter(object, LoggingInterface): return except KeyError: pass + if not self.disable_chapter_detection and \ + (self.chapter_attr[0].match(tagname) and \ + tag.has_key(self.chapter_attr[1]) and \ + self.chapter_attr[2].match(tag[self.chapter_attr[1]])): + self.log_debug('Detected chapter %s', tagname) + self.end_page() + self.page_break_found = True + + if self.options.add_chapters_to_toc: + self.extra_toc_entries.append((self.get_text(tag, + limit=1000), self.current_block)) + end_page = self.process_page_breaks(tag, tagname, tag_css) try: if tagname in ["title", "script", "meta", 'del', 'frameset']: @@ -1680,18 +1707,48 @@ class HTMLConverter(object, LoggingInterface): self.previous_text = ' ' self.process_children(tag, tag_css, tag_pseudo_css) elif tagname == 'table' and not self.ignore_tables and not self.in_table: - tag_css = self.tag_css(tag)[0] # Table should not inherit CSS - try: - self.process_table(tag, tag_css) - except Exception, err: - self.log_warning(_('An error occurred while processing a table: %s. Ignoring table markup.'), str(err)) - self.log_debug('', exc_info=True) - self.log_debug(_('Bad table:\n%s'), str(tag)[:300]) - self.in_table = False - self.process_children(tag, tag_css, tag_pseudo_css) - finally: - if self.minimize_memory_usage: - tag.extract() + if self.render_tables_as_images: + if self.table_render_job_server is None: + from calibre.parallel import Server + self.table_render_job_server = Server(number_of_workers=1) + print 'Rendering table...' + from calibre.ebooks.lrf.html.table_as_image import render_table + pheight = int(self.current_page.pageStyle.attrs['textheight']) + pwidth = int(self.current_page.pageStyle.attrs['textwidth']) + images = render_table(self.table_render_job_server, + self.soup, tag, tag_css, + os.path.dirname(self.target_prefix), + pwidth, pheight, self.profile.dpi, + self.text_size_multiplier_for_rendered_tables) + for path, width, height in images: + stream = ImageStream(path, encoding='PNG') + im = Image(stream, x0=0, y0=0, x1=width, y1=height,\ + xsize=width, ysize=height) + pb = self.current_block + self.end_current_para() + self.process_alignment(tag_css) + self.current_para.append(Plot(im, xsize=width*720./self.profile.dpi, + ysize=height*720./self.profile.dpi)) + self.current_block.append(self.current_para) + self.current_page.append(self.current_block) + self.current_block = self.book.create_text_block( + textStyle=pb.textStyle, + blockStyle=pb.blockStyle) + self.current_para = Paragraph() + + else: + tag_css = self.tag_css(tag)[0] # Table should not inherit CSS + try: + self.process_table(tag, tag_css) + except Exception, err: + self.log_warning(_('An error occurred while processing a table: %s. Ignoring table markup.'), str(err)) + self.log_debug('', exc_info=True) + self.log_debug(_('Bad table:\n%s'), str(tag)[:300]) + self.in_table = False + self.process_children(tag, tag_css, tag_pseudo_css) + finally: + if self.minimize_memory_usage: + tag.extract() else: self.process_children(tag, tag_css, tag_pseudo_css) finally: @@ -1743,6 +1800,9 @@ def process_file(path, options, logger=None): level = logging.DEBUG if options.verbose else logging.INFO logger = logging.getLogger('html2lrf') setup_cli_handlers(logger, level) + + if not isinstance(path, unicode): + path = path.decode(sys.getfilesystemencoding()) path = os.path.abspath(path) default_title = filename_to_utf8(os.path.splitext(os.path.basename(path))[0]) dirpath = os.path.dirname(path) @@ -1821,9 +1881,14 @@ def process_file(path, options, logger=None): re.compile('$') fpb = re.compile(options.force_page_break, re.IGNORECASE) if options.force_page_break else \ re.compile('$') + cq = options.chapter_attr.split(',') + options.chapter_attr = [re.compile(cq[0], re.IGNORECASE), cq[1], + re.compile(cq[2], re.IGNORECASE)] options.force_page_break = fpb options.link_exclude = le options.page_break = pb + if not isinstance(options.chapter_regex, unicode): + options.chapter_regex = options.chapter_regex.decode(preferred_encoding) options.chapter_regex = re.compile(options.chapter_regex, re.IGNORECASE) fpba = options.force_page_break_attr.split(',') if len(fpba) != 3: @@ -1906,7 +1971,7 @@ def try_opf(path, options, logger): continue if not getattr(options, 'cover', None) and orig_cover is not None: options.cover = orig_cover - options.spine = [i.href for i in opf.spine.items()] + options.spine = [i.path for i in opf.spine if i.path] if not getattr(options, 'toc', None): options.toc = opf.toc except Exception: @@ -1940,7 +2005,8 @@ def main(args=sys.argv): except Exception, err: print >> sys.stderr, err return 1 - + if not isinstance(src, unicode): + src = src.decode(sys.getfilesystemencoding()) process_file(src, options) return 0 diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py new file mode 100644 index 0000000000..f4bdfa973d --- /dev/null +++ b/src/calibre/ebooks/lrf/html/table_as_image.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Render HTML tables as images. +''' +import os, tempfile, atexit, shutil, time +from PyQt4.Qt import QWebPage, QUrl, QApplication, QSize, \ + SIGNAL, QPainter, QImage, QObject, Qt + +__app = None + +class HTMLTableRenderer(QObject): + + def __init__(self, html, base_dir, width, height, dpi, factor): + ''' + `width, height`: page width and height in pixels + `base_dir`: The directory in which the HTML file that contains the table resides + ''' + QObject.__init__(self) + + self.app = None + self.width, self.height, self.dpi = width, height, dpi + self.base_dir = base_dir + self.page = QWebPage() + self.connect(self.page, SIGNAL('loadFinished(bool)'), self.render_html) + self.page.mainFrame().setTextSizeMultiplier(factor) + self.page.mainFrame().setHtml(html, + QUrl('file:'+os.path.abspath(self.base_dir))) + self.images = [] + self.tdir = tempfile.mkdtemp(prefix='calibre_render_table') + + def render_html(self, ok): + try: + if not ok: + return + cwidth, cheight = self.page.mainFrame().contentsSize().width(), self.page.mainFrame().contentsSize().height() + self.page.setViewportSize(QSize(cwidth, cheight)) + factor = float(self.width)/cwidth if cwidth > self.width else 1 + cutoff_height = int(self.height/factor)-3 + image = QImage(self.page.viewportSize(), QImage.Format_ARGB32) + image.setDotsPerMeterX(self.dpi*(100/2.54)) + image.setDotsPerMeterX(self.dpi*(100/2.54)) + painter = QPainter(image) + self.page.mainFrame().render(painter) + painter.end() + cheight = image.height() + cwidth = image.width() + pos = 0 + while pos < cheight: + img = image.copy(0, pos, cwidth, min(cheight-pos, cutoff_height)) + pos += cutoff_height-20 + if cwidth > self.width: + img = img.scaledToWidth(self.width, Qt.SmoothTransform) + f = os.path.join(self.tdir, '%d.png'%pos) + img.save(f) + self.images.append((f, img.width(), img.height())) + finally: + QApplication.quit() + +def render_table(server, soup, table, css, base_dir, width, height, dpi, factor=1.0): + head = '' + for e in soup.findAll(['link', 'style']): + head += unicode(e)+'\n\n' + style = '' + for key, val in css.items(): + style += key + ':%s;'%val + html = u'''\ + + + %s + + + + %s + + + '''%(head, width-10, style, unicode(table)) + server.run_job(1, 'render_table', + args=[html, base_dir, width, height, dpi, factor]) + res = None + while res is None: + time.sleep(2) + res = server.result(1) + result, exception, traceback = res + if exception: + print 'Failed to render table' + print exception + print traceback + images, tdir = result + atexit.register(shutil.rmtree, tdir) + return images + +def do_render(html, base_dir, width, height, dpi, factor): + app = QApplication.instance() + if app is None: + app = QApplication([]) + tr = HTMLTableRenderer(html, base_dir, width, height, dpi, factor) + app.exec_() + return tr.images, tr.tdir \ No newline at end of file diff --git a/src/calibre/ebooks/lrf/lit/convert_from.py b/src/calibre/ebooks/lrf/lit/convert_from.py index d93eaf9534..3d8a3f97b0 100644 --- a/src/calibre/ebooks/lrf/lit/convert_from.py +++ b/src/calibre/ebooks/lrf/lit/convert_from.py @@ -57,7 +57,7 @@ def process_file(path, options, logger=None): if opf: path = opf[0] opf = OPFReader(path) - htmlfile = opf.spine.items().next().href.replace('&', '%26') #convertlit replaces & with %26 + htmlfile = opf.spine[0].path.replace('&', '%26') #convertlit replaces & with %26 options.opf = path else: l = glob.glob(os.path.join(tdir, '*toc*.htm*')) diff --git a/src/calibre/ebooks/lrf/meta.py b/src/calibre/ebooks/lrf/meta.py index 9c2882dcee..80fc542c1c 100644 --- a/src/calibre/ebooks/lrf/meta.py +++ b/src/calibre/ebooks/lrf/meta.py @@ -375,7 +375,8 @@ class LRFMetaFile(object): delta = insert_into_file(self._file, stream, self.info_start, \ self.info_start + orig_size - 4) - self.toc_object_offset += delta + if self.toc_object_offset > 0: + self.toc_object_offset += delta self.object_index_offset += delta self.update_object_offsets(delta) @@ -480,7 +481,7 @@ class LRFMetaFile(object): @param args: The values to pack @param fmt: See U{struct} @param start: Position in file at which to write encoded data - """ + """ encoded = struct.pack(kwargs["fmt"], *args) self._file.seek(kwargs["start"]) self._file.write(encoded) @@ -685,3 +686,4 @@ def main(args=sys.argv): if __name__ == '__main__': sys.exit(main()) + diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 2f14441faa..e4fb42cc95 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -1,14 +1,17 @@ +#!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + """ -Provides metadata editing support for PDF and RTF files. For LRF metadata, use -the L{lrf.meta} module. +Provides abstraction for metadata reading.writing from a variety of ebook formats. """ -__docformat__ = "epytext" -__author__ = "Kovid Goyal " +import os, mimetypes, sys +from urllib import unquote, quote +from urlparse import urlparse -from calibre import __version__ as VERSION +from calibre import __version__ as VERSION, relpath from calibre import OptionParser def get_parser(extension): @@ -24,6 +27,136 @@ def get_parser(extension): help=_('Set the comment')) return parser +class Resource(object): + ''' + Represents a resource (usually a file on the filesystem or a URL pointing + to the web. Such resources are commonly referred to in OPF files. + + They have the interface: + + :member:`path` + :member:`mime_type` + :method:`href` + + ''' + + def __init__(self, href_or_path, basedir=os.getcwd(), is_path=True): + self._href = None + self._basedir = None + self.path = None + self.fragment = '' + try: + self.mime_type = mimetypes.guess_type(href_or_path)[0] + except: + self.mime_type = None + if self.mime_type is None: + self.mime_type = 'application/octet-stream' + if is_path: + path = href_or_path + if not os.path.isabs(path): + path = os.path.abspath(os.path.join(path, basedir)) + if isinstance(path, str): + path = path.decode(sys.getfilesystemencoding()) + self.path = path + else: + url = urlparse(href_or_path) + if url[0] not in ('', 'file'): + self._href = href_or_path + else: + pc = url[2] + if isinstance(pc, unicode): + pc.encode('utf-8') + pc = unquote(pc).decode('utf-8') + self.path = os.path.abspath(os.path.join(basedir, pc.replace('/', os.sep))) + self.fragment = unquote(url[-1]) + + + def href(self, basedir=None): + ''' + Return a URL pointing to this resource. If it is a file on the filesystem + the URL is relative to `basedir`. + + `basedir`: If None, the basedir of this resource is used (see :method:`set_basedir`). + If this resource has no basedir, then the current working directory is used as the basedir. + ''' + if basedir is None: + if self._basedir: + basedir = self._basedir + else: + basedir = os.getcwd() + if self.path is None: + return self._href + f = self.fragment.encode('utf-8') if isinstance(self.fragment, unicode) else self.fragment + frag = '#'+quote(f) if self.fragment else '' + if self.path == basedir: + return ''+frag + try: + rpath = relpath(self.path, basedir) + except OSError: # On windows path and basedir could be on different drives + rpath = self.path + if isinstance(rpath, unicode): + rpath = rpath.encode('utf-8') + return quote(rpath.replace(os.sep, '/'))+frag + + def set_basedir(self, path): + self._basedir = path + + def basedir(self): + return self._basedir + + def __repr__(self): + return 'Resource(%s, %s)'%(repr(self.path), repr(self.href())) + + +class ResourceCollection(object): + + def __init__(self): + self._resources = [] + + def __iter__(self): + for r in self._resources: + yield r + + def __len__(self): + return len(self._resources) + + def __getitem__(self, index): + return self._resources[index] + + def __bool__(self): + return len(self._resources) > 0 + + def __str__(self): + resources = map(repr, self) + return '[%s]'%', '.join(resources) + + def __repr__(self): + return str(self) + + def append(self, resource): + if not isinstance(resource, Resource): + raise ValueError('Can only append objects of type Resource') + self._resources.append(resource) + + def remove(self, resource): + self._resources.remove(resource) + + @staticmethod + def from_directory_contents(top, topdown=True): + collection = ResourceCollection() + for spec in os.walk(top, topdown=topdown): + path = os.path.abspath(os.path.join(spec[0], spec[1])) + res = Resource.from_path(path) + res.set_basedir(top) + collection.append(res) + return collection + + def set_basedir(self, path): + for res in self: + res.set_basedir(path) + + + class MetaInformation(object): '''Convenient encapsulation of book metadata''' @@ -32,13 +165,13 @@ class MetaInformation(object): ans = MetaInformation(mi.title, mi.authors) for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'tags', 'cover_data', 'application_id', - 'manifest', 'spine', 'toc', 'cover'): + 'isbn', 'tags', 'cover_data', 'application_id', 'guide', + 'manifest', 'spine', 'toc', 'cover', 'language'): if hasattr(mi, attr): setattr(ans, attr, getattr(mi, attr)) - def __init__(self, title, authors=['Unknown']): + def __init__(self, title, authors=[_('Unknown')]): ''' @param title: title or "Unknown" or a MetaInformation object @param authors: List of strings or [] @@ -63,12 +196,14 @@ class MetaInformation(object): self.rating = None if not mi else mi.rating self.isbn = None if not mi else mi.isbn self.tags = [] if not mi else mi.tags + self.language = None if not mi else mi.language # Typically a string describing the language #: mi.cover_data = (ext, data) self.cover_data = mi.cover_data if (mi and hasattr(mi, 'cover_data')) else (None, None) self.application_id = mi.application_id if (mi and hasattr(mi, 'application_id')) else None self.manifest = getattr(mi, 'manifest', None) self.toc = getattr(mi, 'toc', None) self.spine = getattr(mi, 'spine', None) + self.guide = getattr(mi, 'guide', None) self.cover = getattr(mi, 'cover', None) def smart_update(self, mi): @@ -84,7 +219,8 @@ class MetaInformation(object): for attr in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'application_id', 'manifest', 'spine', 'toc', 'cover'): + 'isbn', 'application_id', 'manifest', 'spine', 'toc', + 'cover', 'language', 'guide'): if hasattr(mi, attr): val = getattr(mi, attr) if val is not None: @@ -114,7 +250,9 @@ class MetaInformation(object): if self.tags: ans += u'Tags : ' +unicode(self.tags) + '\n' if self.series: - ans += u'Series : '+unicode(self.series) + '(%d)'%self.series_index + ans += u'Series : '+unicode(self.series) + ' #%d\n'%self.series_index + if self.language: + ans += u'Language : ' + unicode(self.language) + u'\n' return ans.strip() def __nonzero__(self): diff --git a/src/calibre/ebooks/metadata/lit.py b/src/calibre/ebooks/metadata/lit.py index 892acec3f5..2b8c3a4b9f 100644 --- a/src/calibre/ebooks/metadata/lit.py +++ b/src/calibre/ebooks/metadata/lit.py @@ -5,7 +5,9 @@ Support for reading the metadata from a lit file. ''' import sys, struct, cStringIO, os +from itertools import repeat +from calibre import relpath from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf import OPFReader @@ -188,7 +190,7 @@ class UnBinary(object): def write_spaces(self, depth): - self.buf.write(u' '.join(u'' for i in range(depth))) + self.buf.write(u''.join(repeat(' ', depth))) def item_path(self, internal_id): for i in self.manifest: @@ -692,6 +694,7 @@ class LitFile(object): try: self._stream.seek(self.content_offset + entry.offset) raw = self._stream.read(entry.size) + xml = \ '''\ @@ -721,9 +724,10 @@ def get_metadata(stream): try: litfile = LitFile(stream) src = litfile.meta.encode('utf-8') - mi = OPFReader(cStringIO.StringIO(src)) + mi = OPFReader(cStringIO.StringIO(src), dir=os.getcwd()) cover_url, cover_item = mi.cover, None if cover_url: + cover_url = relpath(cover_url, os.getcwd()) for item in litfile.manifest: if item.path == cover_url: cover_item = item.internal diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index 7c4d5cd1f8..da35a7de0a 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -1,93 +1,205 @@ +import cStringIO __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import uuid '''Read/Write metadata from Open Packaging Format (.opf) files.''' -import sys, re, os, mimetypes -from urllib import unquote -from urlparse import urlparse -import xml.dom.minidom as dom -from itertools import repeat +import sys, re, os, glob from calibre import __appname__ from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup +from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, BeautifulSoup from calibre.ebooks.lrf import entity_to_unicode -from calibre.ebooks.metadata import get_parser +from calibre.ebooks.metadata import get_parser, Resource, ResourceCollection from calibre.ebooks.metadata.toc import TOC -class ManifestItem(object): - def __init__(self, item, cwd): - self.id = item['id'] if item.has_key('id') else '' - self.href = urlparse(unquote(item['href']))[2] if item.has_key('href') else '' - if not os.path.isabs(self.href): - self.href = os.path.join(cwd, self.href) - self.href = os.path.normpath(self.href) - if not os.path.exists(self.href): # Bug in Baen OPF files - nhref = os.path.join(os.path.dirname(self.href), os.path.basename(self.href).replace('__p_.htm', '__c_.htm')) - if os.path.exists(nhref): - self.href = nhref - self.media_type = item['media-type'] if item.has_key('media-type') else '' +class OPFSoup(BeautifulStoneSoup): + + def __init__(self, raw): + BeautifulStoneSoup.__init__(self, raw, + convertEntities=BeautifulSoup.HTML_ENTITIES, + selfClosingTags=['item', 'itemref', 'reference']) + +class ManifestItem(Resource): + + @staticmethod + def from_opf_manifest_item(item, basedir): + if item.has_key('href'): + res = ManifestItem(item['href'], basedir=basedir, is_path=False) + mt = item.get('media-type', '').strip() + if mt: + res.mime_type = mt + return res + + @apply + def media_type(): + def fget(self): + return self.mime_type + def fset(self, val): + self.mime_type = val + return property(fget=fget, fset=fset) + def __unicode__(self): - return u''%(self.id, self.href, self.media_type) + return u''%(self.id, self.href(), self.media_type) + + def __str__(self): + return unicode(self).encode('utf-8') + + def __repr__(self): + return unicode(self) + def __getitem__(self, index): if index == 0: - return self.href + return self.href() if index == 1: return self.media_type raise IndexError('%d out of bounds.'%index) -class Manifest(list): +class Manifest(ResourceCollection): - def __init__(self, soup, dir): - manifest = soup.find('manifest') - if manifest is not None: - for item in manifest.findAll('item'): - self.append(ManifestItem(item, dir)) + @staticmethod + def from_opf_manifest_element(manifest, dir): + m = Manifest() + for item in manifest.findAll('item'): + try: + m.append(ManifestItem.from_opf_manifest_item(item, dir)) + id = item.get('id', '') + if not id: + id = 'id%d'%m.next_id + m[-1].id = id + m.next_id += 1 + except ValueError: + continue + return m + + @staticmethod + def from_paths(entries): + ''' + `entries`: List of (path, mime-type) If mime-type is None it is autodetected + ''' + m = Manifest() + for path, mt in entries: + mi = ManifestItem(path, is_path=True) + if mt: + mi.mime_type = mt + mi.id = 'id%d'%m.next_id + m.next_id += 1 + m.append(mi) + return m + + def __init__(self): + ResourceCollection.__init__(self) + self.next_id = 1 + def item(self, id): for i in self: if i.id == id: - return i + return i + + def id_for_path(self, path): + path = os.path.normpath(os.path.abspath(path)) + for i in self: + if i.path and os.path.normpath(i.path) == path: + return i.id + + def path_for_id(self, id): + for i in self: + if i.id == id: + return i.path -class Spine(object): +class Spine(ResourceCollection): - def __init__(self, soup, manifest): + class Item(Resource): + + def __init__(self, idfunc, *args, **kwargs): + Resource.__init__(self, *args, **kwargs) + self.is_linear = True + self.id = idfunc(self.path) + + @staticmethod + def from_opf_spine_element(spine, manifest): + s = Spine(manifest) + for itemref in spine.findAll('itemref'): + if itemref.has_key('idref'): + r = Spine.Item(s.manifest.id_for_path, + s.manifest.path_for_id(itemref['idref']), is_path=True) + r.is_linear = itemref.get('linear', 'yes') == 'yes' + s.append(r) + return s + + @staticmethod + def from_paths(paths, manifest): + s = Spine(manifest) + for path in paths: + try: + s.append(Spine.Item(s.manifest.id_for_path, path, is_path=True)) + except: + continue + return s + + + + def __init__(self, manifest): + ResourceCollection.__init__(self) self.manifest = manifest - self.linear_ids, self.nonlinear_ids = [], [] - spine = soup.find('spine') - if spine is not None: - for itemref in spine.findAll('itemref'): - if itemref.has_key('idref'): - if itemref.get('linear', 'yes') == 'yes': - self.linear_ids.append(itemref['idref']) - else: - self.nonlinear_ids.append(itemref['idref']) + def linear_items(self): - for id in self.linear_ids: - yield self.manifest.item(id) - + for r in self: + if r.is_linear: + yield r.path def nonlinear_items(self): - for id in self.nonlinear_ids: - yield self.manifest.item(id) - - + for r in self: + if not r.is_linear: + yield r.path + def items(self): - for i in self.linear_ids + self.nonlinear_ids: - mi = self.manifest.item(i) - if getattr(mi, 'href', None): - yield mi - - def __iter__(self): - for i in self.linear_ids + self.nonlinear_ids: - yield i - + for i in self: + yield i.path + +class Guide(ResourceCollection): + + class Reference(Resource): + + @staticmethod + def from_opf_resource_item(ref, basedir): + title, href, type = ref.get('title', ''), ref['href'], ref['type'] + res = Guide.Reference(href, basedir, is_path=False) + res.title = title + res.type = type + return res + + def __repr__(self): + ans = '' + + + @staticmethod + def from_opf_guide(guide_elem, base_dir=os.getcwdu()): + coll = Guide() + for ref in guide_elem.findAll('reference'): + try: + ref = Guide.Reference.from_opf_resource_item(ref, base_dir) + coll.append(ref) + except: + continue + return coll + + def set_cover(self, path): + map(self.remove, [i for i in self if 'cover' in i.type.lower()]) + for type in ('cover', 'other.ms-coverimage-standard', 'other.ms-coverimage'): + self.append(Guide.Reference(path, is_path=True)) + self[-1].type = type + self[-1].title = '' + class standard_field(object): @@ -97,8 +209,6 @@ class standard_field(object): def __get__(self, obj, typ=None): return getattr(obj, 'get_'+self.name)() - def __set__(self, obj, val): - getattr(obj, 'set_'+self.name)(val) class OPF(MetaInformation): @@ -109,6 +219,7 @@ class OPF(MetaInformation): application_id = standard_field('application_id') title = standard_field('title') authors = standard_field('authors') + language = standard_field('language') title_sort = standard_field('title_sort') author_sort = standard_field('author_sort') comments = standard_field('comments') @@ -121,93 +232,15 @@ class OPF(MetaInformation): rating = standard_field('rating') tags = standard_field('tags') - HEADER = '''\ - - -''' def __init__(self): raise NotImplementedError('Abstract base class') - def _initialize(self): - if not hasattr(self, 'soup'): - self.soup = BeautifulStoneSoup(u'''\ -%s - - - - - -'''%(__appname__, self.HEADER)) - - def _commit(self, doc): - self.soup = BeautifulStoneSoup(doc.toxml('utf-8'), fromEncoding='utf-8') - - def _find_element(self, package, name, attrs=[]): - tags = package.getElementsByTagName(name) - for tag in tags: - match = True - for attr, vattr in attrs: - if tag.getAttribute(attr) != vattr: - match = False - break - if match: - return tag - return None - - def _set_metadata_element(self, name, value, attrs=[], - type='dc-metadata', replace=False): - self._initialize() - if isinstance(value, basestring): - value = [value] - attrs = [attrs] - - doc = dom.parseString(self.soup.__str__('UTF-8').strip()) - package = doc.documentElement - metadata = package.getElementsByTagName('metadata')[0] - - dcms = metadata.getElementsByTagName(type) - if dcms: - dcm = dcms[0] - else: - dcm = doc.createElement(type) - metadata.appendChild(dcm) - metadata.appendChild(doc.createTextNode('\n')) - tags = dcm.getElementsByTagName(name) - if tags and not replace: - for tag in tags: - tag.parentNode.removeChild(tag) - tag.unlink() - - for val, vattrs in zip(value, attrs): - if replace: - el = self._find_element(package, name, vattrs) - if el: - el.parentNode.removeChild(el) - el.unlink() - el = doc.createElement(name) - el.appendChild(doc.createTextNode(val)) - for attr, vattr in vattrs: - el.setAttribute(attr, vattr) - dcm.appendChild(el) - dcm.appendChild(doc.createTextNode('\n')) - self._commit(doc) - - def get_title(self): title = self.soup.package.metadata.find('dc:title') if title and title.string: return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip() return self.default_title.strip() - def set_title(self, title): - if not title: - title = 'Unknown' - self._set_metadata_element('dc:title', title) - def get_authors(self): creators = self.soup.package.metadata.findAll('dc:creator') for elem in creators: @@ -225,12 +258,6 @@ class OPF(MetaInformation): return [a.strip() for a in ans] return [] - def set_authors(self, authors): - if not authors: - authors = ['Unknown'] - attrs = list(repeat([('role', 'aut')], len(authors))) - self._set_metadata_element('dc:creator', authors, attrs) - def get_author_sort(self): creators = self.soup.package.metadata.findAll('dc:creator') for elem in creators: @@ -242,18 +269,6 @@ class OPF(MetaInformation): return self.ENTITY_PATTERN.sub(entity_to_unicode, fa).strip() if fa else None return None - def set_author_sort(self, aus): - if not aus: - aus = '' - self._initialize() - if not self.authors: - self.set_authors([]) - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - aut = package.getElementsByTagName('dc:creator')[0] - aut.setAttribute('file-as', aus) - self._commit(doc) - def get_title_sort(self): title = self.soup.package.find('dc:title') if title: @@ -261,61 +276,29 @@ class OPF(MetaInformation): return title['file-as'].strip() return None - def set_title_sort(self, title_sort): - if not title_sort: - title_sort = '' - self._initialize() - if not self.title: - self.title = None - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - tit = package.getElementsByTagName('dc:title')[0] - tit.setAttribute('file-as', title_sort) - self._commit(doc) - def get_comments(self): comments = self.soup.find('dc:description') if comments: return self.ENTITY_PATTERN.sub(entity_to_unicode, comments.string).strip() return None - def set_comments(self, comments): - if not comments: - comments = '' - self._set_metadata_element('dc:description', comments) - def get_uid(self): package = self.soup.find('package') if package.has_key('unique-identifier'): return package['unique-identifier'] - def set_uid(self, uid): - package = self.soup.find('package') - package['unique-identifier'] = str(uid) - def get_category(self): category = self.soup.find('dc:type') if category: return self.ENTITY_PATTERN.sub(entity_to_unicode, category.string).strip() return None - def set_category(self, category): - if not category: - category = '' - self._set_metadata_element('dc:type', category) - def get_publisher(self): publisher = self.soup.find('dc:publisher') if publisher: return self.ENTITY_PATTERN.sub(entity_to_unicode, publisher.string).strip() return None - def set_publisher(self, category): - if not category: - category = 'Unknown' - self._set_metadata_element('dc:publisher', category) - - def get_isbn(self): for item in self.soup.package.metadata.findAll('dc:identifier'): scheme = item.get('scheme') @@ -325,51 +308,27 @@ class OPF(MetaInformation): return str(item.string).strip() return None - def set_isbn(self, isbn): - if isbn: - self._set_metadata_element('dc:identifier', isbn, [('scheme', 'ISBN')], - replace=True) - + def get_language(self): + item = self.soup.package.metadata.find('dc:language') + if not item: + return _('Unknown') + return ''.join(item.findAll(text=True)).strip() + def get_application_id(self): for item in self.soup.package.metadata.findAll('dc:identifier'): if item.has_key('scheme') and item['scheme'] == __appname__: return str(item.string).strip() return None - def set_application_id(self, val): - if val: - self._set_metadata_element('dc:identifier', str(val), [('scheme', __appname__), ('id', __appname__+'_id')], - replace=True) - def get_cover(self): - guide = self.soup.package.find('guide') - if guide: - references = guide.findAll('reference') - for reference in references: - type = reference.get('type') - if not type: - continue - if type.lower() in ['cover', 'other.ms-coverimage-standard', "other.ms-coverimage"]: - return reference.get('href') - return None - - def set_cover(self, path): - self._initialize() - doc = dom.parseString(self.soup.__str__('UTF-8')) - package = doc.documentElement - guide = package.getElementsByTagName('guide') - if guide: - guide = guide[0] - else: - guide = doc.createElement('guide') - package.appendChild(guide) - el = self._find_element(guide, 'reference', [('type', 'cover')]) - if not el: - el = doc.createElement('reference') - guide.appendChild(el) - el.setAttribute('type', 'cover') - el.setAttribute('href', path) - self._commit(doc) + guide = getattr(self, 'guide', []) + if not guide: + guide = [] + references = [ref for ref in guide if 'cover' in ref.type.lower()] + for candidate in ('cover', 'other.ms-coverimage-standard', 'other.ms-coverimage'): + matches = [r for r in references if r.type.lower() == candidate and r.path] + if matches: + return matches[0].path def possible_cover_prefixes(self): isbn, ans = [], [] @@ -388,11 +347,6 @@ class OPF(MetaInformation): return str(s.string).strip() return None - def set_series(self, val): - if not val: - val = '' - self._set_metadata_element('series', val, type='x-metadata') - def get_series_index(self): s = self.soup.package.metadata.find('series-index') if s: @@ -402,11 +356,6 @@ class OPF(MetaInformation): return None return None - def set_series_index(self, val): - if not val: - val = 1 - self._set_metadata_element('series-index', str(val), type='x-metadata') - def get_rating(self): xm = self.soup.package.metadata.find('x-metadata') if not xm: @@ -419,11 +368,6 @@ class OPF(MetaInformation): return None return None - def set_rating(self, val): - if not val: - val = 0 - self._set_metadata_element('rating', str(val), type='x-metadata') - def get_tags(self): ans = [] subs = self.soup.findAll('dc:subject') @@ -433,42 +377,7 @@ class OPF(MetaInformation): ans.append(val) return [unicode(a).strip() for a in ans] - def set_tags(self, tags): - self._set_metadata_element('dc:subject', tags) - - def write(self, stream): - from lxml import etree - root = etree.fromstring(unicode(self.soup)) - root.text = '\n%4s'%' ' - for child in root: - child.text = '\n%8s'%' ' - child.tail = '\n%4s'%' ' if child is not root[-1] else '\n' - for grandchild in child: - grandchild.tail = '\n%8s'%' ' if grandchild is not child[-1] else '\n%4s'%' ' - - metadata = root.find('metadata') - if metadata is not None: - for parent in ['dc-metadata', 'x-metadata']: - parent = metadata.find(parent) - if parent is None: - continue - parent.text = '\n%12s'%' ' - for child in parent: - child.tail = '\n%8s'%' ' if child is parent[-1] else '\n%12s'%' ' - - def fix_self_closing_tags(el): - ''' Makes tags that have only whitespace content self closing ''' - if len(el) == 0 and (el.text is None or el.text.strip() == ''): - el.text = None - for child in el: - fix_self_closing_tags(child) - - fix_self_closing_tags(root) - - raw = self.HEADER + etree.tostring(root, encoding='UTF-8') - - stream.write(raw+'\n') - + class OPFReader(OPF): def __init__(self, stream, dir=os.getcwdu()): @@ -480,15 +389,27 @@ class OPFReader(OPF): self.default_title = stream.name if hasattr(stream, 'name') else 'Unknown' if hasattr(stream, 'seek'): stream.seek(0) - self.soup = BeautifulStoneSoup(stream.read()) + self.soup = OPFSoup(stream.read()) if manage: stream.close() - self.manifest = Manifest(self.soup, dir) - self.spine = Spine(self.soup, self.manifest) + self.manifest = Manifest() + m = self.soup.find('manifest') + if m is not None: + self.manifest = Manifest.from_opf_manifest_element(m, dir) + self.spine = None + spine = self.soup.find('spine') + if spine is not None: + self.spine = Spine.from_opf_spine_element(spine, self.manifest) + self.toc = TOC(base_path=dir) self.toc.read_from_opf(self) + guide = self.soup.find('guide') + if guide is not None: + self.guide = Guide.from_opf_guide(guide, dir) + self.base_dir = dir self.cover_data = (None, None) + class OPFCreator(MetaInformation): def __init__(self, base_path, *args, **kwargs): @@ -502,45 +423,34 @@ class OPFCreator(MetaInformation): self.base_path = os.path.abspath(base_path) if self.application_id is None: self.application_id = str(uuid.uuid4()) - self.toc = None - if isinstance(self.manifest, Manifest): - manifest = [] - for path, mt in self.manifest: - if not path.startswith(self.base_path): - raise ValueError('Inavlid manifest item %s for base path %s'%(path, self.base_path)) - path = path[len(self.base_path)+1:] - manifest.append((path, mt)) - self.manifest = manifest - + if not isinstance(self.toc, TOC): + self.toc = None + if not self.authors: + self.authors = [_('Unknown')] + if self.guide is None: + self.guide = Guide() + if self.cover: + self.guide.set_cover(self.cover) + + def create_manifest(self, entries): ''' Create - @param entries: List of (path, mime-type) - @param base_path: It is used to convert each path into a path relative to itself - @type entries: list of 2-tuples + + `entries`: List of (path, mime-type) If mime-type is None it is autodetected ''' - rentries = [] - base_path = self.base_path - mimetypes.init() - for href, mt in entries: - href = os.path.abspath(href) - if not href.startswith(base_path): - raise ValueError('OPF should only refer to files below it. %s is above %s'%(href, base_path)) - href = href[len(base_path)+1:].replace(os.sep, '/') - if not mt: - mt = mimetypes.guess_type(href)[0] - if not mt: - mt = '' - rentries.append((href, mt)) - - self.manifest = rentries + entries = map(lambda x: x if os.path.isabs(x[0]) else + (os.path.abspath(os.path.join(self.base_path, x[0])), x[1]), + entries) + self.manifest = Manifest.from_paths(entries) + self.manifest.set_basedir(self.base_path) def create_manifest_from_files_in(self, files_and_dirs): - #self.base_path = os.path.commonprefix(files_and_dirs) entries = [] def dodir(dir): - for root, dirs, files in os.walk(dir): + for spec in os.walk(dir): + root, files = spec[0], spec[-1] for name in files: path = os.path.join(root, name) if os.path.isfile(path): @@ -556,47 +466,49 @@ class OPFCreator(MetaInformation): def create_spine(self, entries): ''' - Create the element. Must first call L{create_manifest}. - @param: List of paths - @type param: list of strings - ''' - self.spine = [] + Create the element. Must first call :method:`create_manifest`. - for path in entries: - if not os.path.isabs(path): - path = os.path.join(self.base_path, path) - if not path.startswith(self.base_path): - raise ValueError('Invalid entry %s for base path %s'%(path, self.base_path)) - href = path[len(self.base_path)+1:] - in_manifest = False - for i, m in enumerate(self.manifest): - if m[0] == href: - in_manifest = True - break - if not in_manifest: - raise ValueError('%s is not in the manifest. (%s)'%(href, path)) - self.spine.append(i) - - + `entries`: List of paths + ''' + entries = map(lambda x: x if os.path.isabs(x) else + os.path.abspath(os.path.join(self.base_path, x)), entries) + self.spine = Spine.from_paths(entries, self.manifest) def set_toc(self, toc): ''' - Set the toc. You must call L{create_spine} before calling this + Set the toc. You must call :method:`create_spine` before calling this method. - @param toc: A Table of Contents - @type toc: L{TOC} + + `toc`: A :class:`TOC` object ''' self.toc = toc + def create_guide(self, guide_element): + self.guide = Guide.from_opf_guide(guide_element, self.base_path) + self.guide.set_basedir(self.base_path) + def render(self, opf_stream, ncx_stream=None): from calibre.resources import opf_template - from genshi.template import MarkupTemplate + from calibre.utils.genshi.template import MarkupTemplate template = MarkupTemplate(opf_template) + if self.manifest: + self.manifest.set_basedir(self.base_path) + if not self.guide: + self.guide = Guide() + if self.cover: + cover = self.cover + if not os.path.isabs(cover): + cover = os.path.abspath(os.path.join(self.base_path, cover)) + self.guide.set_cover(cover) + self.guide.set_basedir(self.base_path) + opf = template.generate(__appname__=__appname__, mi=self).render('xml') opf_stream.write(opf) + opf_stream.flush() toc = getattr(self, 'toc', None) if toc is not None and ncx_stream is not None: toc.render(ncx_stream, self.application_id) + ncx_stream.flush() def option_parser(): return get_parser('opf') @@ -607,18 +519,35 @@ def main(args=sys.argv): if len(args) != 2: parser.print_help() return 1 - mi = MetaInformation(OPFReader(open(args[1], 'rb'))) + mi = MetaInformation(OPFReader(open(args[1], 'rb'), os.path.abspath(os.path.dirname(args[1])))) + write = False if opts.title is not None: mi.title = opts.title.replace('&', '&').replace('<', '<').replace('>', '>') + write = True if opts.authors is not None: aus = [i.strip().replace('&', '&').replace('<', '<').replace('>', '>') for i in opts.authors.split(',')] mi.authors = aus + write = True if opts.category is not None: mi.category = opts.category.replace('&', '&').replace('<', '<').replace('>', '>') + write = True if opts.comment is not None: mi.comments = opts.comment.replace('&', '&').replace('<', '<').replace('>', '>') - mo = OPFCreator(os.getcwd(), mi) - mo.render(open(args[1], 'wb')) + write = True + if write: + mo = OPFCreator(os.path.dirname(args[1]), mi) + ncx = cStringIO.StringIO() + mo.render(open(args[1], 'wb'), ncx) + ncx = ncx.getvalue() + if ncx: + f = glob.glob(os.path.join(os.path.dirname(args[1]), '*.ncx')) + if f: + f = open(f[0], 'wb') + else: + f = open(os.path.splitext(args[1])[0]+'.ncx', 'wb') + f.write(ncx) + f.close() + print MetaInformation(OPFReader(open(args[1], 'rb'), os.path.abspath(os.path.dirname(args[1])))) return 0 if __name__ == '__main__': diff --git a/src/calibre/ebooks/metadata/opf.xml b/src/calibre/ebooks/metadata/opf.xml index f2c719d7f6..10623715ff 100644 --- a/src/calibre/ebooks/metadata/opf.xml +++ b/src/calibre/ebooks/metadata/opf.xml @@ -9,7 +9,8 @@ ${mi.title} ${author} ${mi.application_id} - + + ${mi.language if mi.language else 'Unknown'} ${mi.category} ${mi.comments} ${mi.publisher} @@ -17,23 +18,28 @@ ${mi.series} ${mi.series_index} ${mi.rating} - ${tag} + + ${tag} + - - + + + + - - - - - - - - + + - + + + + + + + + diff --git a/src/calibre/ebooks/metadata/toc.py b/src/calibre/ebooks/metadata/toc.py index e63b5363ae..a966dd6fae 100644 --- a/src/calibre/ebooks/metadata/toc.py +++ b/src/calibre/ebooks/metadata/toc.py @@ -65,8 +65,8 @@ class TOC(list): toc = opfreader.soup.find('guide').find('reference', attrs={'type':'toc'})['href'] except: for item in opfreader.manifest: - if 'toc' in item.href.lower(): - toc = item.href + if 'toc' in item.href().lower(): + toc = item.href() break if toc is not None: @@ -120,6 +120,9 @@ class TOC(list): process_navpoint(c, nd) nm = soup.find('navmap') + if nm is None: + raise ValueError('NCX files must have a element.') + for elem in nm: if getattr(elem, 'name', None) == 'navpoint': process_navpoint(elem, self) @@ -138,7 +141,7 @@ class TOC(list): def render(self, stream, uid): from calibre.resources import ncx_template - from genshi.template import MarkupTemplate + from calibre.utils.genshi.template import MarkupTemplate doctype = ('ncx', "-//NISO//DTD ncx 2005-1//EN", "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd") template = MarkupTemplate(ncx_template) raw = template.generate(uid=uid, toc=self, __appname__=__appname__) diff --git a/src/calibre/ebooks/mobi/langcodes.py b/src/calibre/ebooks/mobi/langcodes.py new file mode 100644 index 0000000000..c0884e55a8 --- /dev/null +++ b/src/calibre/ebooks/mobi/langcodes.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +main_language = { + 0 : "NEUTRAL", + 54 : "AFRIKAANS", + 28 : "ALBANIAN", + 1 : "ARABIC", + 43 : "ARMENIAN", + 77 : "ASSAMESE", + 44 : "AZERI", + 45 : "BASQUE", + 35 : "BELARUSIAN", + 69 : "BENGALI", + 2 : "BULGARIAN", + 3 : "CATALAN", + 4 : "CHINESE", + 26 : "CROATIAN", + 5 : "CZECH", + 6 : "DANISH", + 19 : "DUTCH", + 9 : "ENGLISH", + 37 : "ESTONIAN", + 56 : "FAEROESE", + 41 : "FARSI", + 11 : "FINNISH", + 12 : "FRENCH", + 55 : "GEORGIAN", + 7 : "GERMAN", + 8 : "GREEK", + 71 : "GUJARATI", + 13 : "HEBREW", + 57 : "HINDI", + 14 : "HUNGARIAN", + 15 : "ICELANDIC", + 33 : "INDONESIAN", + 16 : "ITALIAN", + 17 : "JAPANESE", + 75 : "KANNADA", + 63 : "KAZAK", + 87 : "KONKANI", + 18 : "KOREAN", + 38 : "LATVIAN", + 39 : "LITHUANIAN", + 47 : "MACEDONIAN", + 62 : "MALAY", + 76 : "MALAYALAM", + 58 : "MALTESE", + 78 : "MARATHI", + 97 : "NEPALI", + 20 : "NORWEGIAN", + 72 : "ORIYA", + 21 : "POLISH", + 22 : "PORTUGUESE", + 70 : "PUNJABI", + 23 : "RHAETOROMANIC", + 24 : "ROMANIAN", + 25 : "RUSSIAN", + 59 : "SAMI", + 79 : "SANSKRIT", + 26 : "SERBIAN", + 27 : "SLOVAK", + 36 : "SLOVENIAN", + 46 : "SORBIAN", + 10 : "SPANISH", + 48 : "SUTU", + 65 : "SWAHILI", + 29 : "SWEDISH", + 73 : "TAMIL", + 68 : "TATAR", + 74 : "TELUGU", + 30 : "THAI", + 49 : "TSONGA", + 50 : "TSWANA", + 31 : "TURKISH", + 34 : "UKRAINIAN", + 32 : "URDU", + 67 : "UZBEK", + 42 : "VIETNAMESE", + 52 : "XHOSA", + 53 : "ZULU", +} + +sub_language = { + 0 : "NEUTRAL", + 1 : "ARABIC_SAUDI_ARABIA", + 2 : "ARABIC_IRAQ", + 3 : "ARABIC_EGYPT", + 4 : "ARABIC_LIBYA", + 5 : "ARABIC_ALGERIA", + 6 : "ARABIC_MOROCCO", + 7 : "ARABIC_TUNISIA", + 8 : "ARABIC_OMAN", + 9 : "ARABIC_YEMEN", + 10 : "ARABIC_SYRIA", + 11 : "ARABIC_JORDAN", + 12 : "ARABIC_LEBANON", + 13 : "ARABIC_KUWAIT", + 14 : "ARABIC_UAE", + 15 : "ARABIC_BAHRAIN", + 16 : "ARABIC_QATAR", + 1 : "AZERI_LATIN", + 2 : "AZERI_CYRILLIC", + 1 : "CHINESE_TRADITIONAL", + 2 : "CHINESE_SIMPLIFIED", + 3 : "CHINESE_HONGKONG", + 4 : "CHINESE_SINGAPORE", + 1 : "DUTCH", + 2 : "DUTCH_BELGIAN", + 1 : "FRENCH", + 2 : "FRENCH_BELGIAN", + 3 : "FRENCH_CANADIAN", + 4 : "FRENCH_SWISS", + 5 : "FRENCH_LUXEMBOURG", + 6 : "FRENCH_MONACO", + 1 : "GERMAN", + 2 : "GERMAN_SWISS", + 3 : "GERMAN_AUSTRIAN", + 4 : "GERMAN_LUXEMBOURG", + 5 : "GERMAN_LIECHTENSTEIN", + 1 : "ITALIAN", + 2 : "ITALIAN_SWISS", + 1 : "KOREAN", + 1 : "LITHUANIAN", + 1 : "MALAY_MALAYSIA", + 2 : "MALAY_BRUNEI_DARUSSALAM", + 1 : "NORWEGIAN_BOKMAL", + 2 : "NORWEGIAN_NYNORSK", + 2 : "PORTUGUESE", + 1 : "PORTUGUESE_BRAZILIAN", + 2 : "SERBIAN_LATIN", + 3 : "SERBIAN_CYRILLIC", + 1 : "SPANISH", + 2 : "SPANISH_MEXICAN", + 4 : "SPANISH_GUATEMALA", + 5 : "SPANISH_COSTA_RICA", + 6 : "SPANISH_PANAMA", + 7 : "SPANISH_DOMINICAN_REPUBLIC", + 8 : "SPANISH_VENEZUELA", + 9 : "SPANISH_COLOMBIA", + 10 : "SPANISH_PERU", + 11 : "SPANISH_ARGENTINA", + 12 : "SPANISH_ECUADOR", + 13 : "SPANISH_CHILE", + 14 : "SPANISH_URUGUAY", + 15 : "SPANISH_PARAGUAY", + 16 : "SPANISH_BOLIVIA", + 17 : "SPANISH_EL_SALVADOR", + 18 : "SPANISH_HONDURAS", + 19 : "SPANISH_NICARAGUA", + 20 : "SPANISH_PUERTO_RICO", + 1 : "SWEDISH", + 2 : "SWEDISH_FINLAND", + 1 : "UZBEK_LATIN", + 2 : "UZBEK_CYRILLIC", + + } \ No newline at end of file diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index ee99047429..cecc43ed19 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -17,9 +17,10 @@ from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.mobi import MobiError from calibre.ebooks.mobi.huffcdic import HuffReader from calibre.ebooks.mobi.palmdoc import decompress_doc +from calibre.ebooks.mobi.langcodes import main_language, sub_language from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf import OPFCreator - +from calibre.ebooks.metadata.toc import TOC class EXTHHeader(object): @@ -44,27 +45,24 @@ class EXTHHeader(object): self.cover_offset, = struct.unpack('>L', content) elif id == 202: self.thumbnail_offset, = struct.unpack('>L', content) - pos += 3 - stop = raw[pos:].find('\x00') - if stop > -1: - self.mi.title = raw[pos:pos+stop].decode(codec, 'ignore') + title = re.search(r'\0+([^\0]+)\0+', raw[pos:]) + if title: + self.mi.title = title.group(1).decode(codec, 'ignore') def process_metadata(self, id, content, codec): if id == 100: - aus = content.split(',') - authors = [] - for a in aus: - authors.extend(a.split('&')) - self.mi.authors = [i.decode(codec, 'ignore') for i in authors] + self.mi.authors = [content.decode(codec, 'ignore').strip()] elif id == 101: - self.mi.publisher = content.decode(codec, 'ignore') + self.mi.publisher = content.decode(codec, 'ignore').strip() elif id == 103: - self.mi.comments = content.decode(codec, 'ignore') + self.mi.comments = content.decode(codec, 'ignore') elif id == 104: - self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '') + self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '') elif id == 105: - self.mi.category = content.decode(codec, 'ignore') + if not self.mi.tags: + self.mi.tags = [] + self.mi.tags.append(content.decode(codec, 'ignore')) @@ -74,6 +72,7 @@ class BookHeader(object): self.compression_type = raw[:2] self.records, self.records_size = struct.unpack('>HH', raw[8:12]) self.encryption_type, = struct.unpack('>H', raw[12:14]) + self.doctype = raw[16:20] self.length, self.type, self.codepage, self.unique_id, self.version = \ struct.unpack('>LLLLL', raw[20:40]) @@ -98,11 +97,18 @@ class BookHeader(object): if self.compression_type == 'DH': self.huff_offset, self.huff_number = struct.unpack('>LL', raw[0x70:0x78]) + langcode = struct.unpack('!L', raw[0x5C:0x60])[0] + langid = langcode & 0xFF + sublangid = (langcode >> 10) & 0xFF + self.language = main_language.get(langid, 'ENGLISH') + self.sublanguage = sub_language.get(sublangid, 'NEUTRAL') + self.exth_flag, = struct.unpack('>L', raw[0x80:0x84]) self.exth = None if self.exth_flag & 0x40: self.exth = EXTHHeader(raw[16+self.length:], self.codec) self.exth.mi.uid = self.unique_id + self.exth.mi.language = self.language class MobiReader(object): @@ -156,7 +162,7 @@ class MobiReader(object): processed_records = self.extract_text() self.add_anchors() - self.processed_html = self.processed_html.decode(self.book_header.codec) + self.processed_html = self.processed_html.decode(self.book_header.codec, 'ignore') self.extract_images(processed_records, output_dir) self.replace_page_breaks() self.cleanup() @@ -166,27 +172,29 @@ class MobiReader(object): self.processed_html) soup = BeautifulSoup(self.processed_html.replace('> <', '>\n<')) + guide = soup.find('guide') for elem in soup.findAll(['metadata', 'guide']): elem.extract() - htmlfile = os.path.join(output_dir, self.name+'.html') + htmlfile = os.path.join(output_dir, self.name+'.html') + for ref in guide.findAll('reference', href=True): + ref['href'] = os.path.basename(htmlfile)+ref['href'] open(htmlfile, 'wb').write(unicode(soup).encode('utf8')) self.htmlfile = htmlfile if self.book_header.exth is not None: - opf = self.create_opf(htmlfile) - opf.render(open(os.path.splitext(htmlfile)[0]+'.opf', 'wb')) + ncx = cStringIO.StringIO() + opf = self.create_opf(htmlfile, guide) + opf.render(open(os.path.splitext(htmlfile)[0]+'.opf', 'wb'), ncx) + ncx = ncx.getvalue() + if ncx: + open(os.path.splitext(htmlfile)[0]+'.ncx', 'wb').write(ncx) def cleanup(self): - self.processed_html = re.sub(r'
', '', - self.processed_html) - self.processed_html = re.sub(r'<([^>]*) height="([^"]*)"', - r'<\1 style="margin-top: \2"', - self.processed_html) - self.processed_html = re.sub(r'<([^>]*) width="([^"]*)"', - r'<\1 style="text-indent: \2"', - self.processed_html) + self.processed_html = re.sub(r'
', '', self.processed_html) + self.processed_html = re.sub(r'<([^>]*) height="([^"]*)"', r'<\1 style="margin-top: \2"', self.processed_html) + self.processed_html = re.sub(r'<([^>]*) width="([^"]*)"', r'<\1 style="text-indent: \2"', self.processed_html) - def create_opf(self, htmlfile): + def create_opf(self, htmlfile, guide=None): mi = self.book_header.exth.mi opf = OPFCreator(os.path.dirname(htmlfile), mi) if hasattr(self.book_header.exth, 'cover_offset'): @@ -198,6 +206,28 @@ class MobiReader(object): opf.create_manifest(manifest) opf.create_spine([os.path.basename(htmlfile)]) + toc = None + if guide: + opf.create_guide(guide) + for ref in opf.guide: + if ref.type.lower() == 'toc': + toc = ref.href() + if toc: + index = self.processed_html.find(' -1: + raw = ''+self.processed_html[index:] + soup = BeautifulSoup(raw) + tocobj = TOC() + for a in soup.findAll('a', href=True): + try: + text = ''.join(a.findAll(text=True)).strip() + except: + text = '' + tocobj.add_item(toc.partition('#')[0], a['href'][1:], text) + if tocobj is not None: + opf.set_toc(tocobj) + return opf @@ -222,7 +252,6 @@ class MobiReader(object): elif self.book_header.compression_type == '\x00\x01': self.mobi_html = ''.join(text_sections) - else: raise MobiError('Unknown compression algorithm: %s'%repr(self.book_header.compression_type)) @@ -235,7 +264,7 @@ class MobiReader(object): def add_anchors(self): positions = set([]) - link_pattern = re.compile(r']+filepos=[\'"]{0,1}(\d+)[^<>]*>', re.IGNORECASE) for match in link_pattern.finditer(self.mobi_html): positions.add(int(match.group(1))) positions = list(positions) @@ -252,7 +281,10 @@ class MobiReader(object): pos = end self.processed_html += self.mobi_html[pos:] - self.processed_html = link_pattern.sub(lambda match: 'Must be a directory.')) d.exec_() diff --git a/src/calibre/gui2/dialogs/config.ui b/src/calibre/gui2/dialogs/config.ui index f6b3957f34..5d00292794 100644 --- a/src/calibre/gui2/dialogs/config.ui +++ b/src/calibre/gui2/dialogs/config.ui @@ -1,4 +1,5 @@ + Kovid Goyal Dialog @@ -76,18 +77,10 @@ 0 - - - - 0 - 0 - 583 - 625 - - - - - + + + + @@ -99,7 +92,7 @@ - + @@ -121,7 +114,7 @@ - + Use &Roman numerals for series number @@ -131,9 +124,35 @@ - - - + + + + + + Format for &single file save: + + + single_format + + + + + + + + + + &Priority for conversion jobs: + + + priority + + + + + + + Default network &timeout: @@ -143,7 +162,7 @@ - + Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information) @@ -164,31 +183,78 @@ - - - - - - &Priority for conversion jobs: - - - priority - - - - - - - + + + + Toolbar + + + + + + + Large + + + + + Medium + + + + + Small + + + + + + + + &Button size in toolbar + + + toolbar_button_size + + + + + + + Show &text in toolbar buttons + + + true + + + + + - + + + + Select visible &columns in library view + + + + + + QAbstractItemView::NoSelection + + + + + + + Frequently used directories - + - + @@ -203,7 +269,7 @@ - + @@ -278,83 +344,6 @@ - - - - Qt::Vertical - - - - 392 - 16 - - - - - - - - Select visible &columns in library view - - - - - - QAbstractItemView::NoSelection - - - - - - - - - - Toolbar - - - - - - - Large - - - - - Medium - - - - - Small - - - - - - - - &Button size in toolbar - - - toolbar_button_size - - - - - - - Show &text in toolbar buttons - - - true - - - - - - @@ -362,8 +351,8 @@ 0 0 - 583 - 625 + 595 + 638 diff --git a/src/calibre/gui2/dialogs/fetch_metadata.ui b/src/calibre/gui2/dialogs/fetch_metadata.ui index e8b4252d8d..8e5747778f 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.ui +++ b/src/calibre/gui2/dialogs/fetch_metadata.ui @@ -9,14 +9,15 @@ 0 0 830 - 700 + 642 Fetch metadata - :/images/metadata.svg + + :/images/metadata.svg:/images/metadata.svg @@ -107,7 +108,7 @@ - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/calibre/gui2/dialogs/job_view.ui b/src/calibre/gui2/dialogs/job_view.ui index d20f67f892..f30c4fc821 100644 --- a/src/calibre/gui2/dialogs/job_view.ui +++ b/src/calibre/gui2/dialogs/job_view.ui @@ -13,13 +13,17 @@ Details of job - :/images/view.svg + + :/images/view.svg:/images/view.svg - - - QTextEdit::NoWrap + + + false + + + true diff --git a/src/calibre/gui2/dialogs/jobs.py b/src/calibre/gui2/dialogs/jobs.py index b601cf2c7c..e0682b6bd8 100644 --- a/src/calibre/gui2/dialogs/jobs.py +++ b/src/calibre/gui2/dialogs/jobs.py @@ -35,7 +35,7 @@ class JobsDialog(QDialog, Ui_JobsDialog): self.jobs_view.setModel(model) self.model = model self.setWindowModality(Qt.NonModal) - self.setWindowTitle(__appname__ + ' - Active Jobs') + self.setWindowTitle(__appname__ + _(' - Jobs')) QObject.connect(self.jobs_view.model(), SIGNAL('modelReset()'), self.jobs_view.resizeColumnsToContents) QObject.connect(self.kill_button, SIGNAL('clicked()'), diff --git a/src/calibre/gui2/dialogs/lrf_single.py b/src/calibre/gui2/dialogs/lrf_single.py index e5df43a673..e8f3d61b7c 100644 --- a/src/calibre/gui2/dialogs/lrf_single.py +++ b/src/calibre/gui2/dialogs/lrf_single.py @@ -1,8 +1,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, cPickle, codecs +import os, codecs -from PyQt4.QtCore import QObject, SIGNAL, Qt, QVariant, QByteArray +from PyQt4.QtCore import QObject, SIGNAL, Qt from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, \ QPixmap, QTextEdit, QListWidgetItem, QIcon @@ -48,10 +48,7 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.gui_mono_family.setModel(self.font_family_model) self.load_saved_global_defaults() - def __init__(self, window, db, row): - QDialog.__init__(self, window) - Ui_LRFSingleDialog.__init__(self) - self.setupUi(self) + def populate_list(self): self.__w = [] self.__w.append(QIcon(':/images/dialog_information.svg')) self.item1 = QListWidgetItem(self.__w[-1], _("Metadata"), self.categoryList) @@ -61,11 +58,17 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.item3 = QListWidgetItem(self.__w[-1], _('Page Setup'), self.categoryList) self.__w.append(QIcon(':/images/chapters.svg')) self.item4 = QListWidgetItem(self.__w[-1], _('Chapter Detection'), self.categoryList) + + def __init__(self, window, db, row): + QDialog.__init__(self, window) + Ui_LRFSingleDialog.__init__(self) + self.setupUi(self) + self.populate_list() self.categoryList.setCurrentRow(0) QObject.connect(self.categoryList, SIGNAL('itemEntered(QListWidgetItem *)'), self.show_category_help) QObject.connect(self.cover_button, SIGNAL("clicked(bool)"), self.select_cover) - self.categoryList.leaveEvent = self.reset_help + #self.categoryList.leaveEvent = self.reset_help self.reset_help() self.selected_format = None self.initialize_common() @@ -277,9 +280,9 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): obj.setWhatsThis(help) self.option_map[guiname] = opt obj.__class__.enterEvent = show_item_help - obj.leaveEvent = self.reset_help + #obj.leaveEvent = self.reset_help self.preprocess.__class__.enterEvent = show_item_help - self.preprocess.leaveEvent = self.reset_help + #self.preprocess.leaveEvent = self.reset_help def show_category_help(self, item): @@ -293,7 +296,8 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): self.set_help(help[text]) def set_help(self, msg): - self.help_view.setHtml('%s'%(msg,)) + if msg and getattr(msg, 'strip', lambda:True)(): + self.help_view.setHtml('%s'%(msg,)) def reset_help(self, *args): self.set_help(_('No help available')) @@ -388,8 +392,9 @@ class LRFBulkDialog(LRFSingleDialog): def __init__(self, window): QDialog.__init__(self, window) - Ui_LRFSingleDialog.__init__(self) + Ui_LRFSingleDialog.__init__(self) self.setupUi(self) + self.populate_list() self.categoryList.takeItem(0) self.stack.removeWidget(self.stack.widget(0)) @@ -399,7 +404,14 @@ class LRFBulkDialog(LRFSingleDialog): self.setWindowTitle(_('Bulk convert ebooks to LRF')) def accept(self): - self.cmdline = self.cmdline = [unicode(i) for i in self.build_commandline()] + self.cmdline = [unicode(i) for i in self.build_commandline()] + for meta in ('--title', '--author', '--publisher', '--comment'): + try: + index = self.cmdline.index(meta) + self.cmdline[index:index+2] = [] + except ValueError: + continue + self.cover_file = None QDialog.accept(self) diff --git a/src/calibre/gui2/dialogs/lrf_single.ui b/src/calibre/gui2/dialogs/lrf_single.ui index 9fd3bee155..c63e4915b7 100644 --- a/src/calibre/gui2/dialogs/lrf_single.ui +++ b/src/calibre/gui2/dialogs/lrf_single.ui @@ -115,7 +115,7 @@ - 0 + 3 @@ -818,6 +818,39 @@ + + + + &Convert tables to images (good for large/complex tables) + + + + + + + &Multiplier for text size in rendered tables: + + + gui_text_size_multiplier_for_rendered_tables + + + + + + + false + + + 2 + + + 0.100000000000000 + + + 1.000000000000000 + + + @@ -918,6 +951,19 @@ + + + + Detect chapter &at tag: + + + gui_chapter_attr + + + + + +
@@ -1048,8 +1094,8 @@ p, li { white-space: pre-wrap; } setCurrentIndex(int) - 191 - 236 + 184 + 279 368 @@ -1064,8 +1110,8 @@ p, li { white-space: pre-wrap; } setDisabled(bool) - 428 - 89 + 650 + 122 788 @@ -1073,22 +1119,6 @@ p, li { white-space: pre-wrap; } - - gui_header - toggled(bool) - gui_headerformat - setEnabled(bool) - - - 348 - 340 - - - 823 - 372 - - - gui_disable_chapter_detection toggled(bool) @@ -1096,12 +1126,60 @@ p, li { white-space: pre-wrap; } setDisabled(bool) - 321 - 78 + 543 + 122 - 322 - 172 + 544 + 211 + + + + + gui_render_tables_as_images + toggled(bool) + gui_text_size_multiplier_for_rendered_tables + setEnabled(bool) + + + 298 + 398 + + + 660 + 435 + + + + + gui_header + toggled(bool) + gui_headerformat + setEnabled(bool) + + + 330 + 367 + + + 823 + 372 + + + + + gui_disable_chapter_detection + toggled(bool) + gui_chapter_attr + setDisabled(bool) + + + 344 + 107 + + + 489 + 465 diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 0cd7fc3a78..99175b656b 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -8,6 +8,7 @@ from PyQt4.QtGui import QDialog from calibre.gui2 import qstring_to_unicode from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog +from calibre.gui2.dialogs.tag_editor import TagEditor class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def __init__(self, window, rows, db): @@ -20,8 +21,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.write_rating = False self.changed = False QObject.connect(self.button_box, SIGNAL("accepted()"), self.sync) - QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.series_changed) - QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.series_changed) QObject.connect(self.rating, SIGNAL('valueChanged(int)'), self.rating_changed) all_series = self.db.all_series() @@ -31,9 +30,17 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series.addItem(name) self.series.lineEdit().setText('') - + QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.series_changed) + QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.series_changed) + QObject.connect(self.tag_editor_button, SIGNAL('clicked()'), self.tag_editor) self.exec_() - + + def tag_editor(self): + d = TagEditor(self, self.db, None) + d.exec_() + if d.result() == QDialog.Accepted: + tag_string = ', '.join(d.tags) + self.tags.setText(tag_string) def sync(self): for id in self.ids: @@ -51,7 +58,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.db.set_publisher(id, pub) tags = qstring_to_unicode(self.tags.text()).strip() if tags: - tags = tags.split(',') + tags = map(lambda x: x.strip(), tags.split(',')) self.db.set_tags(id, tags, append=True) remove_tags = qstring_to_unicode(self.remove_tags.text()).strip() if remove_tags: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index a93df2be76..1b7929cdc6 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -13,9 +13,10 @@ Edit Meta information - :/images/edit_input.svg + + :/images/edit_input.svg:/images/edit_input.svg - + @@ -26,16 +27,7 @@ 6 - - 0 - - - 0 - - - 0 - - + 0 @@ -43,7 +35,7 @@ Meta information - + @@ -57,7 +49,7 @@ - + Change the author(s) of this book. Multiple authors should be separated by a comma @@ -77,7 +69,7 @@ - + Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles. @@ -94,7 +86,7 @@ - + Rating of this book. 0-5 stars @@ -126,7 +118,7 @@ - + Change the publisher of this book @@ -153,6 +145,20 @@ + + + + Open Tag Editor + + + Open Tag Editor + + + + :/images/chapters.svg:/images/chapters.svg + + + @@ -163,7 +169,7 @@ - + Comma separated list of tags to remove from the books. @@ -218,7 +224,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/calibre/gui2/dialogs/tag_editor.py b/src/calibre/gui2/dialogs/tag_editor.py index 8185d1e40a..68eca39c3e 100644 --- a/src/calibre/gui2/dialogs/tag_editor.py +++ b/src/calibre/gui2/dialogs/tag_editor.py @@ -9,14 +9,17 @@ from calibre.gui2 import question_dialog, error_dialog class TagEditor(QDialog, Ui_TagEditor): - def __init__(self, window, db, index): + def __init__(self, window, db, index=None): QDialog.__init__(self, window) Ui_TagEditor.__init__(self) self.setupUi(self) self.db = db self.index = index - tags = self.db.tags(self.index) + if self.index is not None: + tags = self.db.tags(self.index) + else: + tags = [] if tags: tags = [tag.lower().strip() for tag in tags.split(',') if tag.strip()] tags.sort() 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" /> - - - Log:
%s
'%self.log + def notify(self): self.emit(SIGNAL('jobdone(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), self.id, self.description, self.result, self.exception, self.last_traceback, self.log) @@ -109,9 +126,12 @@ class ConversionJob(Job): def formatted_error(self): if self.exception is None: return '' - ans = u'

%s: %s

'%self.exception + ans = u'

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

Traceback:

%s
'%self.last_traceback return ans + + def progress(self, percent, msg): + self.emit(SIGNAL('update_progress(int, PyQt_PyObject)'), self.id, percent) class JobManager(QAbstractTableModel): @@ -149,9 +169,9 @@ class JobManager(QAbstractTableModel): try: if isinstance(job, DeviceJob): job.terminate() - self.process_server.kill(job.id) except: continue + self.process_server.killall() def timerEvent(self, event): if event.timerId() == self.timer_id: @@ -241,7 +261,10 @@ class JobManager(QAbstractTableModel): id = self.next_id job = job_class(id, description, slot, priority, *args, **kwargs) job.server = self.process_server - QObject.connect(job, SIGNAL('status_update(int, int)'), self.status_update, Qt.QueuedConnection) + QObject.connect(job, SIGNAL('status_update(int, int)'), self.status_update, + Qt.QueuedConnection) + self.connect(job, SIGNAL('update_progress(int, PyQt_PyObject)'), + self.update_progress, Qt.QueuedConnection) self.update_lock.lock() self.add_queue.append(job) self.update_lock.unlock() @@ -358,10 +381,19 @@ class JobManager(QAbstractTableModel): _('Cannot kill already completed jobs.')).exec_() return if status == 1: - error_dialog(gui_parent, _('Cannot kill job'), - _('Cannot kill waiting jobs.')).exec_() - return - self.process_server.kill(job.id) + self.update_lock.lock() + try: + self.waiting_jobs.remove(job) + self.finished_jobs.append(job) + self.emit(SIGNAL('job_done(int)'), job.id) + job.result = self.process_server.KILL_RESULT + finally: + self.update_lock.unlock() + else: + self.process_server.kill(job.id) + self.reset() + if len(self.running_jobs) + len(self.waiting_jobs) == 0: + self.emit(SIGNAL('no_more_jobs()')) class DetailView(QDialog, Ui_Dialog): @@ -370,11 +402,14 @@ class DetailView(QDialog, Ui_Dialog): self.setupUi(self) self.setWindowTitle(job.description) self.job = job - txt = self.job.formatted_error() + self.job.formatted_log() + self.connect(self.job, SIGNAL('output_received()'), self.update) + self.update() + + def update(self): + txt = self.job.formatted_error() + self.job.formatted_log() if not txt: txt = 'No details available' - self.log.setHtml(txt) - - + vbar = self.log.verticalScrollBar() + vbar.setValue(vbar.maximum()) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 5ede2b49a0..70f92e2805 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -150,9 +150,13 @@ class BooksModel(QAbstractTableModel): ''' Return list indices of all cells in index.row()''' return [ self.index(index.row(), c) for c in range(self.columnCount(None))] - def save_to_disk(self, rows, path, single_dir=False): + def save_to_disk(self, rows, path, single_dir=False, single_format=None): rows = [row.row() for row in rows] - self.db.export_to_dir(path, rows, self.sorted_on[0] == 1, single_dir=single_dir) + if single_format is None: + return self.db.export_to_dir(path, rows, self.sorted_on[0] == 1, single_dir=single_dir) + else: + return self.db.export_single_format_to_dir(path, rows, single_format) + def delete_books(self, indices): ids = [ self.id(i) for i in indices ] @@ -312,7 +316,7 @@ class BooksModel(QAbstractTableModel): metadata.append(mi) return metadata - def get_preferred_formats(self, rows, formats): + def get_preferred_formats(self, rows, formats, paths=False): ans = [] for row in (row.row() for row in rows): format = None @@ -323,14 +327,15 @@ class BooksModel(QAbstractTableModel): if format: pt = PersistentTemporaryFile(suffix='.'+format) pt.write(self.db.format(row, format)) - pt.seek(0) + pt.flush() + pt.close() if paths else pt.seek(0) ans.append(pt) else: ans.append(None) 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 ' -import sys, logging, os, traceback, time, cPickle +import sys, logging, os, traceback, time -from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider -from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread, \ - QVariant +from PyQt4.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon +from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread -from calibre import __appname__, __version__, __author__, setup_cli_handlers, islinux, Settings +from calibre import __appname__, setup_cli_handlers, islinux, Settings from calibre.ebooks.lrf.lrfparser import LRFDocument from calibre.gui2 import ORG_NAME, APP_UID, error_dialog, choose_files, Application @@ -57,7 +56,7 @@ class Config(QDialog, Ui_ViewerConfig): class Main(MainWindow, Ui_MainWindow): def __init__(self, logger, opts, parent=None): - MainWindow.__init__(self, parent) + MainWindow.__init__(self, opts, parent) Ui_MainWindow.__init__(self) self.setupUi(self) self.setAttribute(Qt.WA_DeleteOnClose) @@ -263,9 +262,12 @@ def file_renderer(stream, opts, parent=None, logger=None): def option_parser(): - from optparse import OptionParser - parser = OptionParser(usage='%prog book.lrf', version=__appname__+' '+__version__, - epilog='Created by ' + __author__) + from calibre.gui2.main_window import option_parser + parser = option_parser('''\ +%prog [options] book.lrf + +Read the LRF ebook book.lrf +''') parser.add_option('--verbose', default=False, action='store_true', dest='verbose', help='Print more information about the rendering process') parser.add_option('--visual-debug', help='Turn on visual aids to debugging the rendering engine', @@ -283,7 +285,7 @@ def normalize_settings(parser, opts): for opt in parser.option_list: if not opt.dest: continue - if getattr(opts, opt.dest) == opt.default: + if getattr(opts, opt.dest) == opt.default and hasattr(saved_opts, opt.dest): continue setattr(saved_opts, opt.dest, getattr(opts, opt.dest)) return saved_opts @@ -298,6 +300,7 @@ def main(args=sys.argv, logger=None): pid = os.fork() if islinux else -1 if pid <= 0: app = Application(args) + app.setWindowIcon(QIcon(':/images/viewer.svg')) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_UID) opts = normalize_settings(parser, opts) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 06c4eaff19..e6f0df58e6 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -10,7 +10,8 @@ from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ from PyQt4.QtSvg import QSvgRenderer from calibre import __version__, __appname__, islinux, sanitize_file_name, \ - Settings, pictureflowerror, iswindows, isosx + Settings, pictureflowerror, iswindows, isosx,\ + preferred_encoding from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat from calibre.devices.errors import FreeSpaceError @@ -23,7 +24,7 @@ from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ from calibre.gui2.cover_flow import CoverFlow, DatabaseImages from calibre.library.database import LibraryDatabase from calibre.gui2.update import CheckForUpdates -from calibre.gui2.main_window import MainWindow +from calibre.gui2.main_window import MainWindow, option_parser from calibre.gui2.main_ui import Ui_MainWindow from calibre.gui2.device import DeviceDetector, DeviceManager from calibre.gui2.status import StatusBar @@ -58,8 +59,8 @@ class Main(MainWindow, Ui_MainWindow): p.end() self.default_thumbnail = (pixmap.width(), pixmap.height(), pixmap_to_data(pixmap)) - def __init__(self, single_instance, parent=None): - MainWindow.__init__(self, parent) + def __init__(self, single_instance, opts, parent=None): + MainWindow.__init__(self, opts, parent) self.single_instance = single_instance if self.single_instance is not None: self.connect(self.single_instance, SIGNAL('message_received(PyQt_PyObject)'), @@ -77,7 +78,6 @@ class Main(MainWindow, Ui_MainWindow): self.conversion_jobs = {} self.persistent_files = [] self.metadata_dialogs = [] - self.viewer_job_id = 1 self.default_thumbnail = None self.device_error_dialog = ConversionErrorDialog(self, _('Error communicating with device'), ' ') self.device_error_dialog.setModal(Qt.NonModal) @@ -113,6 +113,19 @@ class Main(MainWindow, Ui_MainWindow): sm = QMenu() sm.addAction(QIcon(':/images/reader.svg'), _('Send to main memory')) sm.addAction(QIcon(':/images/sd.svg'), _('Send to storage card')) + sm.addAction(QIcon(':/images/reader.svg'), _('Send to main memory')+' '+_('and delete from library')) + sm.addAction(QIcon(':/images/sd.svg'), _('Send to storage card')+' '+_('and delete from library')) + sm.addSeparator() + sm.addAction(_('Send to storage card by default')) + sm.actions()[-1].setCheckable(True) + def default_sync(checked): + Settings().set('send to device by default', bool(checked)) + QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) + QObject.disconnect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card) + QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_card if checked else self.sync_to_main_memory) + QObject.connect(sm.actions()[-1], SIGNAL('toggled(bool)'), default_sync) + sm.actions()[-1].setChecked(Settings().get('send to device by default', False)) + default_sync(sm.actions()[-1].isChecked()) self.sync_menu = sm # Needed md = QMenu() md.addAction(_('Edit metadata individually')) @@ -129,14 +142,16 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.add_menu.actions()[2], SIGNAL("triggered(bool)"), self.add_recursive_multiple) QObject.connect(self.action_del, SIGNAL("triggered(bool)"), self.delete_books) QObject.connect(self.action_edit, SIGNAL("triggered(bool)"), self.edit_metadata) - QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), self.edit_metadata) + QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), partial(self.edit_metadata, bulk=False)) QObject.connect(md.actions()[1], SIGNAL('triggered(bool)'), self.edit_bulk_metadata) - QObject.connect(self.action_sync, SIGNAL("triggered(bool)"), self.sync_to_main_memory) QObject.connect(sm.actions()[0], SIGNAL('triggered(bool)'), self.sync_to_main_memory) QObject.connect(sm.actions()[1], SIGNAL('triggered(bool)'), self.sync_to_card) + QObject.connect(sm.actions()[2], SIGNAL('triggered(bool)'), partial(self.sync_to_main_memory, delete_from_library=True)) + QObject.connect(sm.actions()[3], SIGNAL('triggered(bool)'), partial(self.sync_to_card, delete_from_library=True)) self.save_menu = QMenu() self.save_menu.addAction(_('Save to disk')) self.save_menu.addAction(_('Save to disk in a single directory')) + self.save_menu.addAction(_('Save only %s format to disk')%Settings().get('save to disk single format', 'lrf').upper()) self.view_menu = QMenu() self.view_menu.addAction(_('View')) @@ -145,6 +160,7 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.action_save, SIGNAL("triggered(bool)"), self.save_to_disk) QObject.connect(self.save_menu.actions()[0], SIGNAL("triggered(bool)"), self.save_to_disk) QObject.connect(self.save_menu.actions()[1], SIGNAL("triggered(bool)"), self.save_to_single_dir) + QObject.connect(self.save_menu.actions()[2], SIGNAL("triggered(bool)"), self.save_single_format_to_disk) QObject.connect(self.action_view, SIGNAL("triggered(bool)"), self.view_book) QObject.connect(self.view_menu.actions()[0], SIGNAL("triggered(bool)"), self.view_book) QObject.connect(self.view_menu.actions()[1], SIGNAL("triggered(bool)"), self.view_specific_format) @@ -240,8 +256,6 @@ class Main(MainWindow, Ui_MainWindow): self.status_bar.book_info.book_data.setMaximumHeight(1000) self.setMaximumHeight(available_height()) - - def sync_cf_to_listview(self, index, *args): if not hasattr(index, 'row') and self.library_view.currentIndex().row() != index: @@ -264,14 +278,6 @@ class Main(MainWindow, Ui_MainWindow): elif msg.startswith('refreshdb:'): self.library_view.model().resort() self.library_view.model().research() - elif msg.startswith('progress:'): - try: - fields = msg.split(':') - job_id, percent = fields[1:3] - job_id, percent = int(job_id), float(percent) - self.job_manager.update_progress(job_id, percent) - except: - pass else: print msg @@ -475,7 +481,7 @@ class Main(MainWindow, Ui_MainWindow): else: self.upload_books(paths, names, infos, on_card=on_card) - def upload_books(self, files, names, metadata, on_card=False): + def upload_books(self, files, names, metadata, on_card=False, memory=None): ''' Upload books to device. @param files: List of either paths to files or file like objects @@ -486,13 +492,14 @@ class Main(MainWindow, Ui_MainWindow): files, names, on_card=on_card, job_extra_description=titles ) - self.upload_memory[id] = (metadata, on_card) + self.upload_memory[id] = (metadata, on_card, memory) def books_uploaded(self, id, description, result, exception, formatted_traceback): ''' Called once books have been uploaded. ''' - metadata, on_card = self.upload_memory.pop(id) + metadata, on_card, memory = self.upload_memory.pop(id) + if exception: if isinstance(exception, FreeSpaceError): where = 'in main memory.' if 'memory' in str(exception) else 'on the storage card.' @@ -512,6 +519,9 @@ class Main(MainWindow, Ui_MainWindow): view = self.card_view if on_card else self.memory_view view.model().resort(reset=False) view.model().research() + if memory[1]: + rows = map(self.library_view.model().db.index, memory[1]) + self.library_view.model().delete_books(rows) ############################################################################ @@ -559,17 +569,19 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################### Edit metadata ############################## - def edit_metadata(self, checked): + def edit_metadata(self, checked, bulk=None): ''' - Edit metadata of selected books in library individually. + Edit metadata of selected books in library. ''' rows = self.library_view.selectionModel().selectedRows() - if len(rows) > 1: - return self.edit_bulk_metadata(checked) if not rows or len(rows) == 0: d = error_dialog(self, _('Cannot edit metadata'), _('No books selected')) d.exec_() return + + if bulk or (bulk is None and len(rows) > 1): + return self.edit_bulk_metadata(checked) + for row in rows: d = MetadataSingleDialog(self, row.row(), self.library_view.model().db) @@ -594,11 +606,11 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################# Syncing to device############################# - def sync_to_main_memory(self, checked): - self.sync_to_device(False) + def sync_to_main_memory(self, checked, delete_from_library=False): + self.sync_to_device(False, delete_from_library) - def sync_to_card(self, checked): - self.sync_to_device(True) + def sync_to_card(self, checked, delete_from_library=False): + self.sync_to_device(True, delete_from_library) def cover_to_thumbnail(self, data): p = QPixmap() @@ -609,7 +621,7 @@ class Main(MainWindow, Ui_MainWindow): p = p.scaledToHeight(ht, Qt.SmoothTransformation) return (p.width(), p.height(), pixmap_to_data(p)) - def sync_to_device(self, on_card): + def sync_to_device(self, on_card, delete_from_library): rows = self.library_view.selectionModel().selectedRows() if not self.device_manager or not rows or len(rows) == 0: return @@ -620,8 +632,9 @@ class Main(MainWindow, Ui_MainWindow): if cdata: mi['cover'] = self.cover_to_thumbnail(cdata) metadata = iter(metadata) - files = self.library_view.model().get_preferred_formats(rows, - self.device_manager.device_class.FORMATS) + _files = self.library_view.model().get_preferred_formats(rows, + self.device_manager.device_class.FORMATS, paths=True) + files = [f.name for f in _files] bad, good, gf, names = [], [], [], [] for f in files: mi = metadata.next() @@ -636,7 +649,9 @@ class Main(MainWindow, Ui_MainWindow): try: smi = MetaInformation(mi['title'], aus2) smi.comments = mi.get('comments', None) - set_metadata(f, smi, f.name.rpartition('.')[2]) + _f = open(f, 'r+b') + set_metadata(_f, smi, f.rpartition('.')[2]) + _f.close() except: print 'Error setting metadata in book:', mi['title'] traceback.print_exc() @@ -653,8 +668,9 @@ class Main(MainWindow, Ui_MainWindow): prefix = prefix.encode('ascii', 'ignore') else: prefix = prefix.decode('ascii', 'ignore').encode('ascii', 'ignore') - names.append('%s_%d%s'%(prefix, id, os.path.splitext(f.name)[1])) - self.upload_books(gf, names, good, on_card) + names.append('%s_%d%s'%(prefix, id, os.path.splitext(f)[1])) + remove = [self.library_view.model().id(r) for r in rows] if delete_from_library else [] + self.upload_books(gf, names, good, on_card, memory=(_files, remove)) self.status_bar.showMessage(_('Sending books to device.'), 5000) if bad: bad = '\n'.join('
  • %s
  • '%(i,) for i in bad) @@ -666,20 +682,32 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ ############################## Save to disk ################################ + def save_single_format_to_disk(self, checked): + self.save_to_disk(checked, True, Settings().get('save to disk single format', 'lrf')) + def save_to_single_dir(self, checked): self.save_to_disk(checked, True) - def save_to_disk(self, checked, single_dir=False): + def save_to_disk(self, checked, single_dir=False, single_format=None): rows = self.current_view().selectionModel().selectedRows() if not rows or len(rows) == 0: d = error_dialog(self, _('Cannot save to disk'), _('No books selected')) d.exec_() return + dir = choose_dir(self, 'save to disk dialog', ('Choose destination directory')) if not dir: return if self.current_view() == self.library_view: - self.current_view().model().save_to_disk(rows, dir, single_dir=single_dir) + failures = self.current_view().model().save_to_disk(rows, dir, + single_dir=single_dir, single_format=single_format) + if failures and single_format is not None: + msg = _('

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

      ')%single_format.upper() + for f in failures: + msg += '
    • %s
    • '%f[1] + msg += '
    ' + warning_dialog(self, _('Could not save some ebooks'), msg).exec_() + QDesktopServices.openUrl(QUrl('file:'+dir)) else: paths = self.current_view().model().paths(rows) self.job_manager.run_device_job(self.books_saved, @@ -746,6 +774,15 @@ class Main(MainWindow, Ui_MainWindow): for i, row in enumerate([r.row() for r in rows]): cmdline = list(d.cmdline) + mi = self.library_view.model().db.get_metadata(row) + if mi.title: + cmdline.extend(['--title', mi.title]) + if mi.authors: + cmdline.extend(['--author', ','.join(mi.authors)]) + if mi.publisher: + cmdline.extend(['--publisher', mi.publisher]) + if mi.comments: + cmdline.extend(['--comment', mi.comments]) data = None for fmt in LRF_PREFERRED_SOURCE_FORMATS: try: @@ -771,7 +808,7 @@ class Main(MainWindow, Ui_MainWindow): cmdline.append(pt.name) id = self.job_manager.run_conversion_job(self.book_converted, 'any2lrf', args=[cmdline], - job_description='Convert book %d of %d'%(i, len(rows))) + job_description='Convert book %d of %d'%(i+1, len(rows))) self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format, @@ -851,15 +888,16 @@ class Main(MainWindow, Ui_MainWindow): self._view_file(result) def _view_file(self, name): - if name.upper().endswith('.LRF'): - args = ['lrfviewer', name] - self.job_manager.process_server.run('viewer%d'%self.viewer_job_id, - 'lrfviewer', kwdargs=dict(args=args), - monitor=False) - self.viewer_job_id += 1 - else: - QDesktopServices.openUrl(QUrl('file:'+name))#launch(name) - time.sleep(2) # User feedback + self.setCursor(Qt.BusyCursor) + try: + if name.upper().endswith('.LRF'): + args = ['lrfviewer', name] + self.job_manager.process_server.run_free_job('lrfviewer', kwdargs=dict(args=args)) + else: + QDesktopServices.openUrl(QUrl('file:'+name))#launch(name) + time.sleep(5) # User feedback + finally: + self.unsetCursor() def view_specific_format(self, triggered): rows = self.library_view.selectionModel().selectedRows() @@ -1064,24 +1102,48 @@ class Main(MainWindow, Ui_MainWindow): self.device_error_dialog.show() def conversion_job_exception(self, id, description, exception, formatted_traceback, log): + + def safe_print(msgs, file=sys.stderr): + for i, msg in enumerate(msgs): + if not msg: + msg = '' + if isinstance(msg, unicode): + msgs[i] = msg.encode(preferred_encoding, 'replace') + msg = ' '.join(msgs) + print >>file, msg + + def safe_unicode(self, arg): + if not arg: + arg = unicode(repr(arg)) + if isinstance(arg, str): + arg = arg.decode(preferred_encoding, 'replace') + if not isinstance(arg, unicode): + try: + arg = unicode(repr(arg)) + except: + arg = u'Could not convert to unicode' + return arg + + only_msg = getattr(exception, 'only_msg', False) + description, exception, formatted_traceback, log = map(safe_unicode, + (description, exception, formatted_traceback, log)) try: - print >>sys.stderr, 'Error in job:', description.encode('utf8') + safe_print('Error in job:', description) if log: - print >>sys.stderr, log.encode('utf8', 'ignore') if isinstance(log, unicode) else log - print >>sys.stderr, exception - print >>sys.stderr, formatted_traceback.encode('utf8', 'ignore') if isinstance(formatted_traceback, unicode) else formatted_traceback + safe_print(log) + safe_print(exception) + safe_print(formatted_traceback) except: pass - if getattr(exception, 'only_msg', False): - error_dialog(self, _('Conversion Error'), unicode(exception)).exec_() + if only_msg: + error_dialog(self, _('Conversion Error'), exception).exec_() return - msg = u'

    %s: %s

    '%exception + msg = u'

    %s:'%exception msg += u'

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

    Detailed traceback:

    '
    -        msg += formatted_traceback + '
    ' - 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)
             
         
    @@ -1162,6 +1224,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)
    @@ -1169,7 +1238,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__,
    @@ -1177,14 +1246,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 @@ -1195,7 +1264,7 @@ if __name__ == '__main__': except: if not iswindows: raise from PyQt4.QtGui import QErrorMessage - logfile = os.path.expanduser('~/calibre.log') + logfile = os.path.join(os.path.expanduser('~'), 'calibre.log') if os.path.exists(logfile): log = open(logfile).read() if log.strip(): diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index c2b5efc0ed..c84ce915fe 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -3,13 +3,43 @@ __copyright__ = '2008, Kovid Goyal ' import StringIO, traceback, sys -from PyQt4.QtGui import QMainWindow +from PyQt4.Qt import QMainWindow, QString, Qt, QFont from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog +from calibre import OptionParser + +def option_parser(usage='''\ +Usage: %prog [options] + +Launch the Graphical User Interface +'''): + parser = OptionParser(usage) + parser.add_option('--redirect-console-output', default=False, action='store_true', dest='redirect', + help=_('Redirect console output to a dialog window (both stdout and stderr). Useful on windows where GUI apps do not have a output streams.')) + return parser + +class DebugWindow(ConversionErrorDialog): + + def __init__(self, parent): + ConversionErrorDialog.__init__(self, parent, 'Console output', '') + self.setModal(Qt.NonModal) + font = QFont() + font.setStyleHint(QFont.TypeWriter) + self.text.setFont(font) + + def write(self, msg): + self.text.setPlainText(self.text.toPlainText()+QString(msg)) + + def flush(self): + pass class MainWindow(QMainWindow): - def __init__(self, parent=None): + def __init__(self, opts, parent=None): QMainWindow.__init__(self, parent) + if 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 @@ class MainWindow(QMainWindow): print >>sys.stderr, fe msg = '

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

    ' msg += '

    Detailed traceback:

    '+fe+'
    ' - d = ConversionErrorDialog(self, 'ERROR: Unhandled exception', msg) + d = ConversionErrorDialog(self, _('ERROR: Unhandled exception'), msg) d.exec_() except: pass \ No newline at end of file diff --git a/src/calibre/gui2/pictureflow/PyQt/configure.py b/src/calibre/gui2/pictureflow/PyQt/configure.py index e24e9a8405..8b6295d817 100644 --- a/src/calibre/gui2/pictureflow/PyQt/configure.py +++ b/src/calibre/gui2/pictureflow/PyQt/configure.py @@ -43,6 +43,7 @@ else: makefile.extra_lib_dirs = ['..\\..\\.build\\release', '../../.build', '.'] makefile.extra_libs = ['pictureflow0' if 'win' in sys.platform and 'darwin' not in sys.platform else "pictureflow"] makefile.extra_cflags = ['-arch i386', '-arch ppc'] if 'darwin' in sys.platform else [] +makefile.extra_lflags = ['-arch i386', '-arch ppc'] if 'darwin' in sys.platform else [] makefile.extra_cxxflags = makefile.extra_cflags # Generate the Makefile itself. diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py index 55e5c3f901..8b059f5711 100644 --- a/src/calibre/gui2/status.py +++ b/src/calibre/gui2/status.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import textwrap, re +import re from PyQt4.QtGui import QStatusBar, QMovie, QLabel, QFrame, QHBoxLayout, QPixmap, \ QVBoxLayout, QSizePolicy, QToolButton, QIcon diff --git a/src/calibre/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 edda1c8502..6e4ceb95b8 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -11,7 +11,10 @@ import sys, os from textwrap import TextWrapper from calibre import OptionParser, Settings, terminal_controller, preferred_encoding -from calibre.gui2 import SingleApplication +try: + from calibre.utils.single_qt_application import send_message +except: + send_message = None from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata.opf import OPFCreator, OPFReader from calibre.library.database import LibraryDatabase, text_to_tokens @@ -97,14 +100,14 @@ List the books available in the calibre database. if not set(fields).issubset(FIELDS): parser.print_help() print - print _('Invalid fields. Available fields:'), ','.join(FIELDS) + print >>sys.stderr, _('Invalid fields. Available fields:'), ','.join(FIELDS) return 1 db = get_db(dbpath, opts) if not opts.sort_by in FIELDS: parser.print_help() print - print _('Invalid sort field. Available fields:'), ','.join(FIELDS) + print >>sys.stderr, _('Invalid sort field. Available fields:'), ','.join(FIELDS) return 1 do_list(db, fields, opts.sort_by, opts.ascending, opts.search) @@ -118,6 +121,7 @@ class DevNull(object): NULL = DevNull() def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): + orig = sys.stdout sys.stdout = NULL try: files, dirs = [], [] @@ -166,27 +170,26 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): for mi, formats in dir_dups: db.import_book(mi, formats) else: - print _('The following books were not added as they already exist in the database (see --duplicates option):') + print >>sys.stderr, _('The following books were not added as they already exist in the database (see --duplicates option):') for mi, formats in dir_dups: title = mi.title if isinstance(title, unicode): title = title.encode(preferred_encoding) - print '\t', title + ':' + print >>sys.stderr, '\t', title + ':' for path in formats: - print '\t\t ', path + print >>sys.stderr, '\t\t ', path if file_duplicates: for path, mi in zip(file_duplicates[0], file_duplicates[2]): title = mi.title if isinstance(title, unicode): title = title.encode(preferred_encoding) - print '\t', title+':' - print '\t\t ', path - - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') + 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 @@ -209,7 +212,7 @@ the directory related options below. if len(args) < 2: parser.print_help() print - print _('You must specify at least one file to add') + print >>sys.stderr, _('You must specify at least one file to add') return 1 do_add(get_db(dbpath, opts), args[1:], opts.one_book_per_directory, opts.recurse, opts.duplicates) return 0 @@ -222,10 +225,10 @@ def do_remove(db, ids): for y in x: db.delete_book(y) - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') - + if send_message is not None: + send_message('refreshdb:', 'calibre GUI') + + def command_remove(args, dbpath): parser = get_parser(_( '''\ @@ -239,7 +242,7 @@ list of id numbers (you can get id numbers by using the list command). For examp if len(args) < 2: parser.print_help() print - print _('You must specify at least one book to remove') + print >>sys.stderr, _('You must specify at least one book to remove') return 1 ids = [] @@ -270,7 +273,7 @@ by id. You can get id by using the list command. If the format already exists, i if len(args) < 3: parser.print_help() print - print _('You must specify an id and an ebook file') + print >>sys.stderr, _('You must specify an id and an ebook file') return 1 id, file, fmt = int(args[1]), open(args[2], 'rb'), os.path.splitext(args[2])[-1] @@ -296,7 +299,7 @@ do nothing. if len(args) < 3: parser.print_help() print - print _('You must specify an id and a format') + print >>sys.stderr, _('You must specify an id and a format') return 1 id, fmt = int(args[1]), args[2].upper() @@ -327,7 +330,7 @@ id is an id number from the list command. if len(args) < 2: parser.print_help() print - print _('You must specify an id') + print >>sys.stderr, _('You must specify an id') return 1 id = int(args[1]) do_show_metadata(get_db(dbpath, opts), id, opts.as_opf) @@ -337,10 +340,9 @@ def do_set_metadata(db, id, stream): mi = OPFReader(stream) db.set_metadata(id, mi) do_show_metadata(db, id, False) - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - sa.send_message('refreshdb:') - + if send_message is not None: + send_message('refreshdb:', 'calibre GUI') + def command_set_metadata(args, dbpath): parser = get_parser(_( ''' @@ -355,15 +357,47 @@ show_metadata command. if len(args) < 3: parser.print_help() print - print _('You must specify an id and a metadata file') + print >>sys.stderr, _('You must specify an id and a metadata file') return 1 id, opf = int(args[1]), open(args[2], 'rb') do_set_metadata(get_db(dbpath, opts), id, opf) 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 dc4f4e31de..d3f4654969 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -1384,6 +1384,9 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; self.conn.execute('VACUUM;') self.conn.commit() + def all_ids(self): + return [i[0] for i in self.conn.execute('SELECT id FROM books').fetchall()] + def export_to_dir(self, dir, indices, byauthor=False, single_dir=False, index_is_id=False): if not os.path.exists(dir): @@ -1418,7 +1421,6 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; name = au + ' - ' + title if byauthor else title + ' - ' + au name += '_'+id base = dir if single_dir else tpath - mi = OPFCreator(base, self.get_metadata(idx, index_is_id=index_is_id)) cover = self.cover(idx, index_is_id=index_is_id) if cover is not None: @@ -1427,6 +1429,8 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; open(cpath, 'wb').write(cover) mi.cover = cname f = open(os.path.join(base, sanitize_file_name(name)+'.opf'), 'wb') + if not mi.authors: + mi.authors = [_('Unknown')] mi.render(f) f.close() @@ -1543,6 +1547,25 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; if res is not None: duplicates.extend(res) return duplicates + + def export_single_format_to_dir(self, dir, indices, format, index_is_id=False): + if not index_is_id: + indices = map(self.id, indices) + failures = [] + for id in indices: + try: + data = self.format(id, format, index_is_id=True) + except: + failures.append((id, self.title(id, index_is_id=True))) + title = self.title(id, index_is_id=True) + au = self.authors(id, index_is_id=True) + if not au: + au = _('Unknown') + fname = '%s - %s.%s'%(title, au, format.lower()) + fname = sanitize_file_name(fname) + open(os.path.join(dir, fname), 'wb').write(data) + return failures + class SearchToken(object): diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 3bc5cd9467..a7999050bb 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -46,9 +46,10 @@ entry_points = { 'librarything = calibre.ebooks.metadata.library_thing:main', 'mobi2oeb = calibre.ebooks.mobi.reader:main', 'lrf2html = calibre.ebooks.lrf.html.convert_to:main', - 'calibre-debug = calibre.debug:main', - 'calibredb = calibre.library.cli:main', + 'calibre-debug = calibre.debug:main', + 'calibredb = calibre.library.cli:main', 'calibre-fontconfig = calibre.utils.fontconfig:main', + 'calibre-parallel = calibre.parallel:main', ], 'gui_scripts' : [ __appname__+' = calibre.gui2.main:main', @@ -353,7 +354,7 @@ def install_man_pages(fatal_errors): prog = src[:src.index('=')].strip() if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', 'markdown-calibre', 'calibre-debug', 'fb2-meta', - 'calibre-fontconfig'): + 'calibre-fontconfig', 'calibre-parallel'): continue help2man = ('help2man', prog, '--name', 'part of %s'%__appname__, '--section', '1', '--no-info', '--include', diff --git a/src/calibre/linux_installer.py b/src/calibre/linux_installer.py index 7a55d134d3..a4fc1cff77 100644 --- a/src/calibre/linux_installer.py +++ b/src/calibre/linux_installer.py @@ -8,6 +8,8 @@ Download and install the linux binary. ''' import sys, os, shutil, tarfile, subprocess, tempfile, urllib2, re, stat +MOBILEREAD='https://dev.mobileread.com/dist/kovid/calibre/' + class TerminalController: """ A class that can be used to portably generate formatted output to @@ -239,7 +241,7 @@ def do_postinstall(destdir): def download_tarball(): pb = ProgressBar(TerminalController(sys.stdout), 'Downloading calibre...') - src = urllib2.urlopen('http://calibre.kovidgoyal.net/downloads/latest-linux-binary.tar.bz2') + src = urllib2.urlopen(MOBILEREAD+'calibre-%version-i686.tar.bz2') size = int(src.info()['content-length']) f = tempfile.NamedTemporaryFile() while f.tell() < size: diff --git a/src/calibre/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 sphinx.ext.autodoc import get_module_charset, prepare_docstring from docutils.statemachine import ViewList from docutils import nodes -from genshi.template import TextTemplate +from genshi.template import OldTextTemplate 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 3d169f4822..e174f37c7c 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -1,178 +1,719 @@ +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 re, sys, tempfile, os, cPickle, traceback, atexit, binascii, time, subprocess +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.ptempfile import PersistentTemporaryFile +from calibre import iswindows, detect_ncpus, isosx -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 import iswindows, __appname__, islinux -try: - from calibre.utils.single_qt_application import SingleApplication -except: - SingleApplication = None - -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) - - +#: 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=report_progress), - } + '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') - popen = 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'), '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 -def cleanup(tdir): - try: - import shutil - shutil.rmtree(tdir, True) - except: - pass - -class Server(object): +class WorkerStatus(object): + ''' + A platform independent class to control child processes. Provides the + methods: - #: Interval in seconds at which child processes are polled for status information - INTERVAL = 0.1 - KILL_RESULT = 'Server: job killed by user|||#@#$%&*)*(*$#$%#$@&' + .. 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): - self.tdir = tempfile.mkdtemp('', '%s_IPC_'%__appname__) - atexit.register(cleanup, self.tdir) - self.kill_jobs = [] + 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') - def kill(self, job_id): - ''' - Kill the job identified by job_id. - ''' - self.kill_jobs.append(str(job_id)) + for func in ('spawn_free_spirit', 'spawn_worker'): + setattr(self, func, getattr(self, func+'_'+ext)) - def _terminate(self, process): - ''' - Kill process. - ''' + + 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 + while len(msg) > 0: + if length is None: + length = len(msg) + chunk = ('%-12d'%length) + msg[:4096-12] + msg = msg[4096-12:] + else: + chunk, msg = msg[:4096], msg[4096:] + w = select([], [socket], [], timeout)[1] + if not w: + raise RuntimeError('Write to socket timed out') + if socket.sendall(chunk) is not None: + raise RuntimeError('Failed to write chunk to socket') + + +def read(socket, timeout=5): + ''' + 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]: + msg = socket.recv(4096) + if not msg: + break + if length is None: + length, msg = int(msg[:12]), msg[12:] + buf.write(msg) + if buf.tell() >= length: + break + if not length: + return '' + msg = buf.getvalue()[:length] + if len(msg) < length: + raise RuntimeError('Corrupted packet received') + + return msg + +class RepeatingTimer(Thread): + ''' + 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: + self.event.wait(self.interval) + if self.event.isSet(): + break + self.action() + + def __init__(self, interval, func, name): + self.event = Event() + self.interval = interval + self.action = func + 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.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 + self.last_job_time = time.time() + self.job_id = None + self._stop = False + if not select([self.socket], [], [], 120)[0]: + raise RuntimeError(_('Could not launch worker process.')) + ID = self.read().split(':') + if ID[0] != 'CALIBRE_WORKER': + raise RuntimeError('Impostor') + self.worker_pid = int(ID[1]) + self.write('OK') + if self.read() != 'WAITING': + raise RuntimeError('Worker sulking') + + def terminate(self): + 'Kill worker process.' + try: + if self.socket: + self.write('STOP:') + time.sleep(1) + self.socket.shutdown(socket.SHUT_RDWR) + except: + pass if iswindows: win32api = __import__('win32api') try: - win32api.TerminateProcess(int(process.pid), -1) + handle = win32api.OpenProcess(1, False, self.worker_pid) + win32api.TerminateProcess(handle, -1) except: pass else: - import signal - os.kill(process.pid, signal.SIGKILL) - time.sleep(0.05) - - + try: + self.os.kill(self.worker_pid, self.signal.SIGKILL) + time.sleep(0.05) + except: + pass - def run(self, job_id, func, args=[], kwdargs={}, monitor=True): - ''' - Run a job in a separate process. - @param job_id: A unique (per server) identifier - @param func: One of C{PARALLEL_FUNCS.keys()} - @param args: A list of arguments to pass of C{func} - @param kwdargs: A dictionary of keyword arguments to pass to C{func} - @param monitor: If False launch the child process and return. Do not monitor/communicate with it. - @return: (result, exception, formatted_traceback, log) where log is the combined - stdout + stderr of the child process; or None if monitor is True. If a job is killed - by a call to L{kill()} then result will be L{KILL_RESULT} - ''' - job_id = str(job_id) - job_dir = os.path.join(self.tdir, job_id) - if os.path.exists(job_dir): - raise ValueError('Cannot run job. The job_id %s has already been used.'%job_id) - os.mkdir(job_dir) - job_data = os.path.join(job_dir, 'job_data.pickle') - cPickle.dump((job_id, func, args, kwdargs), open(job_data, 'wb'), -1) - prefix = '' - if hasattr(sys, 'frameworks_dir'): - fd = getattr(sys, 'frameworks_dir') - prefix = 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd - if fd not in os.environ['PATH']: - os.environ['PATH'] += ':'+fd - cmd = prefix + 'from calibre.parallel import run_job; run_job(\'%s\')'%binascii.hexlify(job_data) + def write(self, msg, timeout=None): + write(self.socket, msg, timeout=self.timeout if timeout is None else timeout) - if not monitor: - popen([python, '-c', cmd], stdout=subprocess.PIPE, stdin=subprocess.PIPE, - stderr=subprocess.PIPE) + def read(self, timeout=None): + return read(self.socket, timeout=self.timeout if timeout is None else timeout) + + def __eq__(self, other): + return hasattr(other, 'process') and hasattr(other, 'worker_pid') and self.worker_pid == other.worker_pid + + def __bool__(self): + 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)) + msg = self.read() + if msg != 'OK': + raise ControlError('Failed to initialize job on worker %d:%s'%(self.worker_pid, msg)) + self.output = job.output if callable(job.output) else sys.stdout.write + self.progress = job.progress if callable(job.progress) else None + self.job = job + + def control(self): + ''' + Listens for messages from the worker process and dispatches them + appropriately. If the worker process dies unexpectedly, returns a result + of None with a ControlError indicating the worker died. + + Returns a :class:`Result` instance or None, if the worker is still working. + ''' + if select([self.socket],[],[],0)[0]: + 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): + + def __init__(self, job_id, func, args, kwdargs, output, progress, done): + self.job_id = job_id + self.func = func + self.args = args + self.kwdargs = kwdargs + self.output = output + self.progress = progress + self.done = done + +class Result(object): + + def __init__(self, result, exception, traceback): + self.result = result + self.exception = exception + self.traceback = traceback + + def __len__(self): + return 3 + + def __item__(self, i): + return (self.result, self.exception, self.traceback)[i] + + def __iter__(self): + return iter((self.result, self.exception, self.traceback)) + +class Server(Thread): + + KILL_RESULT = Overseer.KILL_RESULT + START_PORT = 10013 + + def __init__(self, number_of_workers=detect_ncpus()): + Thread.__init__(self) + self.setDaemon(True) + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.port = self.START_PORT + while True: + try: + self.server_socket.bind(('localhost', self.port)) + break + except: + self.port += 1 + self.server_socket.listen(5) + self.number_of_workers = number_of_workers + self.pool, self.jobs, self.working, self.results = [], collections.deque(), [], {} + atexit.register(self.killall) + atexit.register(self.close) + self.job_lock = RLock() + self.overseer_lock = RLock() + self.working_lock = RLock() + self.result_lock = RLock() + self.pool_lock = RLock() + self.start() + + def close(self): + try: + self.server_socket.shutdown(socket.SHUT_RDWR) + except: + pass + + def add_job(self, job): + with self.job_lock: + self.jobs.append(job) + + def store_result(self, result, id=None): + if id: + with self.job_lock: + self.results[id] = result + + def result(self, id): + with self.result_lock: + return self.results.pop(id, None) + + def run(self): + while True: + job = None + with self.job_lock: + if len(self.jobs) > 0 and len(self.working) < self.number_of_workers: + job = self.jobs.popleft() + with self.pool_lock: + o = 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) + + with self.working_lock: + done = [] + for o in self.working: + try: + res = o.control() + except Exception, err: + res = Result(None, unicode(err), traceback.format_exc()) + o.terminate() + if isinstance(res, Result): + o.job.done(res) + done.append(o) + for o in done: + self.working.remove(o) + if o: + with self.pool_lock: + self.pool.append(o) + + try: + time.sleep(1) + except: + return + + + def killall(self): + with self.pool_lock: + map(lambda x: x.terminate(), self.pool) + self.pool = [] + + + def kill(self, job_id): + with self.working_lock: + pop = None + for o in self.working: + if o.job_id == job_id: + o.terminate() + o.job.done(Result(self.KILL_RESULT, None, '')) + pop = o + break + if pop is not None: + self.working.remove(pop) + + + + def run_job(self, job_id, func, args=[], kwdargs={}, + output=None, progress=None, done=None): + ''' + Run a job in a separate process. Supports job control, output redirection + and progress reporting. + ''' + if done is None: + done = partial(self.store_result, id=job_id) + job = Job(job_id, func, args, kwdargs, output, progress, done) + with self.job_lock: + self.jobs.append(job) + + def run_free_job(self, func, args=[], kwdargs={}): + pt = PersistentTemporaryFile('.pickle', '_IPC_') + pt.write(cPickle.dumps((func, args, kwdargs))) + pt.close() + mother.spawn_free_spirit(binascii.hexlify(pt.name)) + + +########################################################################################## +##################################### CLIENT CODE ##################################### +########################################################################################## + +class BufferedSender(object): + + def __init__(self, socket): + self.socket = socket + self.wbuf, self.pbuf = [], [] + self.wlock, self.plock = RLock(), RLock() + self.timer = RepeatingTimer(0.5, self.send, 'BufferedSender') + self.timer.start() + + def write(self, msg): + if not isinstance(msg, basestring): + msg = unicode(msg) + with self.wlock: + self.wbuf.append(msg) + + def send(self): + if 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 - output = open(os.path.join(job_dir, 'output.txt'), 'wb') - p = popen([python, '-c', cmd], stdout=output, stderr=output, - stdin=subprocess.PIPE) - p.stdin.close() - while p.returncode is None: - if job_id in self.kill_jobs: - self._terminate(p) - return self.KILL_RESULT, None, None, _('Job killed by user') - time.sleep(0.1) - p.poll() + with self.wlock: + if self.wbuf: + msg = cPickle.dumps(self.wbuf, -1) + self.wbuf = [] + write(self.socket, 'OUTPUT:'+msg) + read(self.socket, 10) + + with self.plock: + if self.pbuf: + msg = cPickle.dumps(self.pbuf, -1) + self.pbuf = [] + write(self.socket, 'PROGRESS:'+msg) + read(self.socket, 10) + + def notify(self, percent, msg=''): + with self.plock: + self.pbuf.append((percent, msg)) - - output.close() - job_result = os.path.join(job_dir, 'job_result.pickle') - if not os.path.exists(job_result): - result, exception, traceback = None, ('ParallelRuntimeError', - 'The worker process died unexpectedly.'), '' - else: - result, exception, traceback = cPickle.load(open(job_result, 'rb')) - log = open(output.name, 'rb').read() - - return result, exception, traceback, log - + def flush(self): + pass -def run_job(job_data): - global sa, job_id - if SingleApplication is not None: - sa = SingleApplication('calibre GUI') - job_data = binascii.unhexlify(job_data) - base = os.path.dirname(job_data) - job_result = os.path.join(base, 'job_result.pickle') - job_id, func, args, kwdargs = cPickle.load(open(job_data, 'rb')) - func = PARALLEL_FUNCS[func] - exception, tb = None, None +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, 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 + + +def worker(host, port): + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client_socket.connect((host, port)) + write(client_socket, 'CALIBRE_WORKER:%d'%os.getpid()) + msg = read(client_socket, timeout=10) + if msg != 'OK': + return 1 + write(client_socket, 'WAITING') + + sys.stdout = BufferedSender(client_socket) + sys.stderr = sys.stdout + + while True: + 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:]) + write(client_socket, 'OK') + try: + result = work(client_socket, func, args, kwdargs) + write(client_socket, 'RESULT:'+ cPickle.dumps(result)) + except (Exception, SystemExit), err: + exception = (err.__class__.__name__, unicode(str(err), 'utf-8', 'replace')) + tb = traceback.format_exc() + write(client_socket, 'ERROR:'+cPickle.dumps((exception, tb),-1)) + if read(client_socket, 10) != 'OK': + break + gc.collect() + elif msg == 'PING:': + write(client_socket, 'OK') + elif msg == 'STOP:': + client_socket.shutdown(socket.SHUT_RDWR) + return 0 + elif not msg: + time.sleep(1) + else: + print >>sys.__stderr__, 'Invalid protocols message', msg + return 1 + +def free_spirit(path): + func, args, kwdargs = cPickle.load(open(path, 'rb')) try: - result = func(*args, **kwdargs) - except (Exception, SystemExit), err: - result = None - exception = (err.__class__.__name__, unicode(str(err), 'utf-8', 'replace')) - tb = traceback.format_exc() - - if os.path.exists(os.path.dirname(job_result)): - cPickle.dump((result, exception, tb), open(job_result, 'wb')) - -def main(): - src = sys.argv[2] - job_data = re.search(r'run_job\(\'([a-f0-9A-F]+)\'\)', src).group(1) - run_job(job_data) + os.unlink(path) + except: + pass + 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(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()) - - + diff --git a/src/calibre/terminfo.py b/src/calibre/terminfo.py index 2141b9115b..121f5fcfd1 100644 --- a/src/calibre/terminfo.py +++ b/src/calibre/terminfo.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, re +import sys, re, os """ Get information about the terminal we are running in """ @@ -94,7 +94,7 @@ class TerminalController: except: return # If the stream isn't a tty, then assume it has no capabilities. - if 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 e586a11f50..ed9a8483a0 100644 --- a/src/calibre/trac/plugins/download.py +++ b/src/calibre/trac/plugins/download.py @@ -1,6 +1,6 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import re, glob +import re from pkg_resources import resource_filename from trac.core import Component, implements @@ -12,7 +12,7 @@ from trac.util import Markup __appname__ = 'calibre' DOWNLOAD_DIR = '/var/www/calibre.kovidgoyal.net/htdocs/downloads' LINUX_INSTALLER = '/var/www/calibre.kovidgoyal.net/calibre/src/calibre/linux_installer.py' - +MOBILEREAD = 'https://dev.mobileread.com/dist/kovid/calibre/' class OS(dict): """Dictionary with a default value for unknown keys.""" @@ -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 @@ class Distribution(object): self.command = cmd.strip() easy_install = 'easy_install' if os == 'debian': - self.command += '\n'+prefix + 'cp -R /usr/share/pycentral/fonttools/site-packages/FontTools* /usr/lib/python2.5/site-packages/' easy_install = 'easy_install-2.5' - self.command += '\n'+prefix+easy_install+' -U TTFQuery calibre \n'+prefix+'calibre_postinstall' + self.command += '\n'+prefix+easy_install+' -U calibre \n'+prefix+'calibre_postinstall' try: self.manual = Markup(self.MANUAL_MAP[os]) except KeyError: @@ -119,7 +117,7 @@ class Download(Component): if req.path_info == '/download': return self.top_level(req) elif req.path_info == '/download_linux_binary_installer': - req.send(open(LINUX_INSTALLER).read(), 'text/x-python') + req.send(open(LINUX_INSTALLER).read().replace('%version', self.version_from_filename()), 'text/x-python') else: match = re.match(r'\/download_(\S+)', req.path_info) if match: @@ -153,8 +151,7 @@ class Download(Component): def version_from_filename(self): try: - file = glob.glob(DOWNLOAD_DIR+'/*.exe')[0] - return re.search(r'\S+-(\d+\.\d+\.\d+)\.', file).group(1) + return open(DOWNLOAD_DIR+'/latest_version', 'rb').read().strip() except: return '0.0.0' @@ -165,7 +162,7 @@ class Download(Component): installer_name='Windows installer', title='Download %s for windows'%(__appname__), compatibility='%s works on Windows XP and Windows Vista.'%(__appname__,), - path='/downloads/'+file, app=__appname__, + path=MOBILEREAD+file, app=__appname__, note=Markup(\ '''

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

    @@ -203,7 +200,7 @@ You can uninstall a driver by right clicking on it and selecting uninstall. installer_name='OS X universal dmg', title='Download %s for OS X'%(__appname__), compatibility='%s works on OS X Tiger and above.'%(__appname__,), - path='/downloads/'+file, app=__appname__, + path=MOBILEREAD+file, app=__appname__, note=Markup(\ '''
      @@ -232,7 +229,7 @@ If not, head over to \n" "Language-Team: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "HTML or CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " "device. Default: %s Supported profiles: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,25 @@ msgid "" "class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "
      Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.
      Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "

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

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

        Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "No help available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

        They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override
        CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "\n" "\n" +"\n" "

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

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

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

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

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

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

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

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

        There was an error reading from file:
        " msgstr "

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

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

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

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

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

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

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

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

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

            " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 +msgid "Edit Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +msgid "Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +msgid "Author S&ort: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +msgid "" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +msgid "&Rating:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +msgid "Rating of this book. 0-5 stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +msgid " stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 +msgid "Add Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 +msgid "&Remove tags:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 +msgid "Comma separated list of tags to remove from the books. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +msgid "" +"

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

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

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

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

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

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

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

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

            Use the Test functionality below to test your regular " +"expression on a few sample filenames." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:98 +msgid "Regular &expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:99 +msgid "&Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:100 +msgid "File &name:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:101 +msgid "Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:102 +msgid "Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:103 +msgid "Regular expression group name (?P)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:61 +msgid "No match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +msgid "Authors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +msgid "Regular expression group name (?P<authors>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108 +msgid "Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109 +msgid "Regular expression group name (?P<series>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +msgid "Series index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +msgid "Regular expression group name (?P<series_index>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 +msgid "ISBN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 +msgid "Job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 +msgid "Status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 +msgid "Progress" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 +msgid "Running time" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Waiting" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 +msgid "Cannot kill job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 +msgid "" +"Cannot kill jobs that are communicating with the device as this may cause " +"data corruption." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 +msgid "Cannot kill already completed jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 +msgid "Cannot kill waiting jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +msgid "Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 +msgid "Double click to <b>edit</b> me<br><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 +msgid "Size (MB)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 +msgid "Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 +msgid "Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +msgid "Configure Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +msgid "Use white background" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:50 +msgid "Hyphenate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:51 +msgid "<b>Changes will only take affect after a restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 +msgid " - LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "No matches found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128 +msgid "LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:129 +msgid "Parsing LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:130 +msgid "LRF Viewer toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 +msgid "Next Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 +msgid "Previous Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133 +msgid "Back" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134 +msgid "Forward" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135 +msgid "Next match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:136 +msgid "Open ebook" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137 +msgid "Configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +msgid "" +"<p>For help visit <a " +"href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 +msgid "Send to main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +msgid "Send to storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +msgid "Edit metadata individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +msgid "Edit metadata in bulk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +msgid "" +"Add books recursively (One book per directory, assumes every ebook file is " +"the same book in a different format)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +msgid "" +"Add books recursively (Multiple books per directory, assumes every ebook " +"file is a different book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +msgid "Save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +msgid "View" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 +msgid "Device database corrupted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +msgid "" +"\n" +" <p>The database of books on the reader is corrupted. Try the " +"following:\n" +" <ol>\n" +" <li>Unplug the reader. Wait for it to finish regenerating " +"the database (i.e. wait till it is ready to be used). Plug it back in. Now " +"it should work with %(app)s. If not try the next step.</li>\n" +" <li>Quit %(app)s. Find the file media.xml in the reader's " +"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +"file. Re-connect it and start %(app)s.</li>\n" +" </ol>\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 +msgid "" +"<p>Books with the same title as the following already exist in the database. " +"Add them anyway?<ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 +msgid "Duplicates found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 +msgid "No space on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 +msgid "" +"<p>Cannot upload books to device there is no more free space available " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 +msgid "Sending books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 +msgid "No suitable formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 +msgid "" +"Could not upload the following books to the device, as no suitable formats " +"were found:<br><ul>%s</ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 +msgid "Fetch news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 +msgid "News fetched. Uploading to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 +msgid "Starting Bulk conversion of %d books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +msgid "%s has no available formats." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure while there are running jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 +msgid "Copying database to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 +msgid "Invalid database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 +msgid "" +"<p>An invalid database already exists at %s, delete it before trying to move " +"the existing database.<br>Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 +msgid "Could not move database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 +msgid "No detailed info available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 +msgid "No detailed information is available for books on the device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 +msgid "Error talking to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 +msgid "Conversion Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "Database does not exist" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "" +"The directory in which the database should be: %s no longer exists. Please " +"choose a new database location." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 +msgid "" +"<span style=\"color:red; font-weight:bold\">Latest version: <a " +"href=\"%s\">%s</a></span>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "" +"%s has been updated to version %s. See the <a " +"href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " +"Visit the download page?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "Update available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +msgid "calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +msgid "Advanced search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +msgid "Alt+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +msgid "" +"Search the list of books by title or author<br><br>Words separated by spaces " +"are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +msgid "" +"Search the list of books by title, author, publisher, tags and " +"comments<br><br>Words separated by spaces are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 +msgid "Reset Quick Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +msgid "Add books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +msgid "Edit meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +msgid "E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +msgid "Send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +msgid "S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +msgid "Fetch news" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +msgid "F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +msgid "Convert E-books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +msgid "C" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 +msgid "V" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 +msgid "Add a custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 +msgid "" +"<p>Please enter your username and password for %s<br>If you do not have one, " +"please subscribe to get access to the articles.<br/> Click OK to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 +msgid "Custom news sources" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to browse books by their covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to turn off Cover Browsing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +msgid "" +"<p>Browsing books by their covers is disabled.<br>Import of pictureflow " +"module failed:<br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:38 +msgid "Invalid regular expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:39 +msgid "Invalid regular expression: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 +msgid "" +"Reader\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 +msgid "" +"Card\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 +msgid "Click to see the list of books available on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 +msgid "Click to see the list of books in the main memory of your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 +msgid "Click to see the list of books on the storage card in your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 +msgid "" +"Path to the calibre database. Default is to use the path stored in the " +"settings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 +msgid "" +"%prog list [options]\n" +"\n" +"List the books available in the calibre database. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +msgid "" +"The fields to display when listing books in the database. Should be a comma " +"separated list of fields.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +msgid "" +"The field by which to sort the results.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +msgid "Sort results in ascending order" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 +msgid "" +"Filter the results by the search query. For the format of the search query, " +"please see the search related documentation in the User Manual. Default is " +"to do no filtering." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 +msgid "Invalid fields. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 +msgid "Invalid sort field. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +msgid "" +"The following books were not added as they already exist in the database " +"(see --duplicates option):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +msgid "" +"%prog add [options] file1 file2 file3 ...\n" +"\n" +"Add the specified files as books to the database. You can also specify " +"directories, see\n" +"the directory related options below. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +msgid "" +"Assume that each directory has only a single logical book and that all files " +"in it are different e-book formats of that book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +msgid "Process directories recursively" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +msgid "" +"Add books to database even if they already exist. Comparison is done based " +"on book titles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +msgid "You must specify at least one file to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +msgid "" +"%prog remove ids\n" +"\n" +"Remove the books identified by ids from the database. ids should be a comma " +"separated list of id numbers (you can get id numbers by using the list " +"command). For example, 23,34,57-85\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +msgid "You must specify at least one book to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +msgid "" +"%prog add_format [options] id ebook_file\n" +"\n" +"Add the ebook in ebook_file to the available formats for the logical book " +"identified by id. You can get id by using the list command. If the format " +"already exists, it is replaced.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +msgid "You must specify an id and an ebook file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +msgid "ebook file must have an extension" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +msgid "" +"\n" +"%prog remove_format [options] id fmt\n" +"\n" +"Remove the format fmt from the logical book identified by id. You can get id " +"by using the list command. fmt should be a file extension like LRF or TXT or " +"EPUB. If the logical book does not have fmt available, do nothing.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +msgid "You must specify an id and a format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +msgid "" +"%%prog command [options] [arguments]\n" +"\n" +"%%prog is the command line interface to the calibre books database. \n" +"\n" +"command is one of:\n" +" %s\n" +" \n" +"For help on an individual command: %%prog command --help\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +msgid "Could not initialize the fontconfig library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 +msgid "URL must have the scheme sftp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:57 +msgid "host must be of the form user@hostname" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:68 +msgid "Failed to negotiate SSH session: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:71 +msgid "Failed to authenticate with server: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:77 +msgid "Unknown feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 +msgid "Untitled article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:15 +msgid "" +"%%prog [options] ARG\n" +"\n" +"%%prog parses an online source of articles, like an RSS or ATOM feed and \n" +"fetches the article contents organized in a nice hierarchy.\n" +"\n" +"ARG can be one of:\n" +"\n" +"file name - %%prog will try to load a recipe from the file\n" +"\n" +"builtin recipe title - %%prog will load the builtin recipe and use it to " +"fetch the feed. For e.g. Newsweek or \"The BBC\" or \"The New York Times\"\n" +"\n" +"recipe as a string - %%prog will load the recipe directly from the string " +"arg.\n" +"\n" +"Available builtin recipes are:\n" +"%s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37 +msgid "" +"Options to control web2disk (used to fetch websites linked from feeds)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:40 +msgid "" +"Specify a list of feeds to download. For example: \n" +"\"['http://feeds.newsweek.com/newsweek/TopNews', " +"'http://feeds.newsweek.com/headlines/politics']\"\n" +"If you specify this option, any argument to %prog is ignored and a default " +"recipe is used to download the feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 +msgid "Be more verbose while processing." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 +msgid "" +"The title for this recipe. Used as the title for any ebooks created from the " +"downloaded feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:47 +msgid "Username for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:48 +msgid "Password for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:51 +msgid "" +"Number of levels of links to follow on webpages that are linked to from " +"feeds. Defaul %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53 +msgid "" +"The directory in which to store the downloaded feeds. Defaults to the " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55 +msgid "Dont show the progress bar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 +msgid "Very verbose output, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 +msgid "" +"Useful for recipe development. Forces max_articles_per_feed to 2 and " +"downloads at most 2 feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:576 +msgid "Fetching feeds..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:33 +msgid "Unknown News Source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:474 +msgid "Download finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:476 +msgid "Failed to download the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:478 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:484 +msgid " from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:482 +msgid "Failed to download parts of the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:486 +msgid "\tFailed links:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:558 +msgid "Could not fetch article. Run with --debug to see the reason" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 +msgid "Got feeds from index page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 +msgid "Trying to download cover..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:636 +msgid "Starting download [%d thread(s)]..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:649 +msgid "Feeds downloaded to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:659 +msgid "Could not download cover: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:664 +msgid "Downloading cover from %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +msgid "Untitled Article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:743 +msgid "" +"\n" +"Downloaded article %s from %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 +msgid "Article downloaded: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:755 +msgid "Failed to download article: %s from %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 +msgid "Article download failed: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:775 +msgid "Fetching feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:382 +msgid "" +"%prog URL\n" +"\n" +"Where URL is for example http://google.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:385 +msgid "Base directory into which URL is saved. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:388 +msgid "" +"Timeout in seconds to wait for a response from the server. Default: %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:391 +msgid "" +"Maximum number of levels to recurse i.e. depth of links to follow. Default " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:394 +msgid "" +"The maximum number of files to download. This only applies to files from <a " +"href> tags. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:396 +msgid "" +"Minimum interval in seconds between consecutive fetches. Default is %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:398 +msgid "" +"The character encoding for the websites you are trying to download. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:400 +msgid "" +"Only links that match this regular expression will be followed. This option " +"can be specified multiple times, in which case as long as a link matches any " +"one regexp, it will be followed. By default all links are followed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:402 +msgid "" +"Any link that matches this regular expression will be ignored. This option " +"can be specified multiple times, in which case as long as any regexp matches " +"a link, it will be ignored.By default, no links are ignored. If both --" +"filter-regexp and --match-regexp are specified, then --filter-regexp is " +"applied first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:404 +msgid "Do not download CSS stylesheets." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:405 +msgid "Show detailed output information. Useful for debugging" +msgstr "" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index 60e3560a54..6c9a0a18c1 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 <Unknown>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-29 16:58+0000\n" +"Last-Translator: Kovid Goyal <Unknown>\n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -37,6 +37,12 @@ msgstr "" #~ "Expresión regular. Las marcas <a> que tengan href coincidentes, son " #~ "ignoradas. Por defecto: %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Evita la inserción automática de saltos de página delante de los capítulos " +#~ "detectados." + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -57,6 +63,12 @@ msgstr "" #~ "fuents, familia\" ( --serif-family \"%s, Times New Roman\")\n" #~ " " +#~ msgid "&Access Key;" +#~ msgstr "Clave de &acceso;" + +#~ msgid "Job killed by user" +#~ msgstr "Trabajo detenido por el usuario" + #~ msgid "%s is not available in LRF format. Please convert it first." #~ msgstr "\"%s\" no es un archivo LRF. Conviértalo primero." @@ -139,11 +151,34 @@ msgstr "" #~ "Guardar el texto de abajo en el archivo recipe.py y enviarlo a un amigo para " #~ "permitirle también a él usar esta receta." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Creado por " @@ -166,8 +201,12 @@ msgstr "" "defecto: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Desconocido" @@ -190,7 +229,7 @@ msgstr "Clave de orden para el autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editorial" @@ -225,6 +264,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 +339,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 +349,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 <a> tags are " @@ -331,7 +390,7 @@ msgstr "" "Número máximo de niveles para procesar enlaces recursivamente. El valor 0 " "(cero) indica que no se seguirán. Un valor negativo, ignora las marcas <a>." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -339,18 +398,15 @@ msgstr "" "Una expresión regular. Las etiquetas <a> cuyos atributos href coincidan " "serán ignoradas. Por defecto es %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "No incluir enlaces en el índice de contenidos" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Evita la inserción automática de saltos de página delante de los capítulos " -"detectados." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Impedir la detección automática de capítulos." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -358,7 +414,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 +445,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 +464,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 +481,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 +526,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 +597,56 @@ msgstr "Opciones para controlar el comportamiento de html2rtf" msgid "Fetching of recipe failed: " msgstr "Obtención fallida de la receta: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer archivo detectado." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalizando HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen archivo detectado. Volver a analizar..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "HTML preprocesado escrito en " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Procesando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConversión a BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "No se pudo analizar el archivo: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s es un archivo vacío" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "No se pudo analizar el enlace %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "No se puedo añadir el enlac %s al TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Incapaz de procesar imagen %s. Error: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Incapaz de procesar PNG entrelazado %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -580,14 +654,14 @@ msgstr "" "No se puedo procesar imagen: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ocurrió un error al procesar la tabla: %s. Se ignora la identificación de la " "tabla." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -595,11 +669,11 @@ msgstr "" "Tabla errónea:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "La tabla contiene una celda demasiado larga" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -607,19 +681,19 @@ msgstr "" "Primero debe guardar la página web %s como un archivo html y después " "ejecutar html2rtf sobre él." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "No se puedo leer la imagen de portada: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "No se puedo leer de: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Incapaz de procesar el archivo opf" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -947,19 +1021,19 @@ msgstr "Uso: pdf-meta archivo.pdf" msgid "No filename specified." msgstr "Nombre de archivo sin especificar." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opciones] miebook.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Directorio de salida. Por defecto es el directorio actual" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "HTML MOBI en bruto guardado en" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "Ebook OEB creado en" @@ -967,18 +1041,18 @@ msgstr "Ebook OEB creado en" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Título" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Comentarios" @@ -1005,33 +1079,33 @@ msgstr "Básico" msgid "Advanced" msgstr "Avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Debe ser un directorio." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Ubicación no válida " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Ubicación no válida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Ubicación no válida.<br>Imposible escribir en " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Compactando base de datos. Esto podría durar un rato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Compactando..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuración" @@ -1046,21 +1120,21 @@ msgstr "Navegar a la nueva ubicación de la base de datos" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1145,9 +1219,9 @@ msgid "ERROR" msgstr "ERROR" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autor(es)" @@ -1159,19 +1233,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 +1273,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 +1289,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 +1297,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 +1309,72 @@ msgstr "Trebajos activos" msgid "&Stop selected job" msgstr "&Detener trabajo seleccionado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Apariencia" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Configuración de página" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Detección de capítulos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Formatos no disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "No se puede convertir %s porque el formato no está soportado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Elegir el formato a conertir en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Convertir %s a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Fijar valores de conversión por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "No se puede leer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "No tienes permiso de lectura en el archivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Error leyendo archivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Hubo un error leyendo el archivo: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " no es una imagen válida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1300,22 +1382,22 @@ msgstr "" "Preprocesar el archivo antes de convertir a LRF, útil si se conoce el origen " "del archivo. Tipos de archivos conocidos:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Libros de BAEN Publishers</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - Archivos HTML creados con el programa pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - Archivos HTML0 de Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1323,7 +1405,7 @@ msgstr "" "Especificar datos como título y autor para el libro.<p>Esta información se " "actualiza tanto en la base de datos como en el archivo LRF." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1331,76 +1413,76 @@ msgstr "" "Mejorar la apariencia del archivo LRF generado, especificando el tamaño de " "fuente y el espaciado entre palabras." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" "Configuración de página del dispositivo: márgenes y tamaño de la pantalla" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Afinar la detección de capítulos y secciones." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Ayuda no disponible</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Convertir ebooks a LRF en masa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Convertir a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categoría" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opciones" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Portada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Cambia la imagen de &portada:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Localizar una imagen a utilizar como portada de este libro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Usar portada del archivo &fuente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Título: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Cambiar el título del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Autor(es): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1408,30 +1490,30 @@ msgstr "" "Cambia el(los) autor(es). Para especificar más de uno, sepárelos mediante " "comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "O&rd&en por autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editorial: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Cambia la editorial del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Etique&tas: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1439,183 +1521,196 @@ msgstr "" "Etiquetas para categorizar el libr (muy útil en búsquedas). <br><br>Puede " "utilizarse qualquier palabra o frase, separada medante comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Series:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Listado de series conocidas. Se puede añadir nuevas series." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Índice de serie." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Libro " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Tamaño de la &fuente base:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " puntos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Fuentes incrustadas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "&Codificación de la fuente:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "&Sangrado mínimo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "&Espaciado de palabras:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "Activa la &rotación automática de imágenes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Inserta líneas en &blanco entre párrafos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignora las &tablas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Ignorar &colores" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocesamiento:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "Encabezado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "&Mostrar encabezado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "&Formato del encabezado:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "Substituye<br>CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "&Perfil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margen &Izquierdo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " Píxeles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "Margen &Derecho:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "Margen &Superior:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "Margen &Inferior:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" +"&Convertir las tablas a imágenes (bueno para tablas grandes y complejas)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "&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 "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1625,8 +1720,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1636,17 +1731,17 @@ msgid "Edit Meta information" msgstr "Editar Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-información" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "&Ordenar autores: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1655,19 +1750,19 @@ msgstr "" "Federico García Lorca como Lorca, Federico" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Valoración:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Valora este libro: 0-5 estrellas" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " estrellas" @@ -1709,52 +1804,52 @@ msgstr "No se puede descargar la portada" msgid "You must specify the ISBN identifier for this book." msgstr "Especifique primero un ISBN válido para el libro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Editar meta-información" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Abrir editor de etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" "Eliminar series que no están en uso (series que no tienen ningún libro " "asociado)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "Buscar metadatos en el servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Formatos disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "Añadir un nuevo formato para este libro en la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina los formatos seleccionados para este libro de la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Buscar portada en el servidor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "Cambiar nombre de usuario y/o clave de tu cuenta de LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Cambiar contraseña" @@ -1783,13 +1878,13 @@ msgid "Tag" msgstr "Etiqueta" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Series" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formato" @@ -1822,39 +1917,39 @@ msgstr "" msgid "Negate" msgstr "Negar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Búsqueda avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Satisfacer todos los criterios siguientes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Satisfacer alguno de los siguientes criterios" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Criterios de búsqueda" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Más" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Menos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editor de etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Etiquetas disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1862,23 +1957,23 @@ msgstr "" "Borrar etiquetas de la base de datos. Esta acción desasignará la etiqueta de " "todos los libros y la borrará de la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Aplicar etiqueta al libro actual" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Etiquetas aplicadas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Eliminar etiqueta del libro actual" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "añadir etiqueta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1887,7 +1982,7 @@ msgstr "" "la puede añadir desde aquí. También puede usar una lista de etiquetas " "separadas por comas." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Añadir etiqueta a la lista de etiquetas disponibles y aplicarla al libro " @@ -1906,95 +2001,95 @@ msgid "Recipe for " msgstr "Receta para " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "Cambiar a modo avanzado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Cambiar a modo básico" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "el Feed debe tener un título" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Newsfeed tiene que aver un título" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "El feed ha de tener una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "el Feed debe tener una dirección" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Ya existe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Este Feed ya se ha añadido a la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Entrada incorrecta" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Entrada incorrecta" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>No se puede crear la receta. Error:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Reemplazar la receta?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "una receta personalizada llamada %s ya existe. Quiere reemplazarla?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Seleccionar un archivo de receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Recetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Añadir nueva fuente personalizada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Recetas de usuario disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Añadir/Actualizar &receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Eliminar receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "&Compartir receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "&Cargar receta desde un archivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -2018,56 +2113,56 @@ msgstr "" "necesitará utilizar el \"modo avanzado\" para una configuración mas " "detallada del proceso de adquisición de los datos</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Título de la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "&Artículo más antiguo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "El artículo más antiguo a descargar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " días" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "Número máximo de articulos por feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Número máximo de articulos a descargar por cada feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds en la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Eliminar feeds de la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Añadir feeds a la receta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Título del newsfeed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Newsfeed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "&Añadir feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2076,7 +2171,7 @@ msgstr "" "<a href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Recetas de " "Usuario</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Código fuente de la receta (python)" @@ -2161,45 +2256,45 @@ msgstr "Nombre de grupo de expresión regular (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Trabajo" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Estado" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progreso" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Tiempo transcurrido en ejecución" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Error" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Terminado" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "En espera..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Procesando..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "No se puede detener este trabajo" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2207,62 +2302,62 @@ msgstr "" "No se pueden detener los trabajos que estan en comunicación con el " "dispositivo ya que pueden causar corrupción de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "No se pueden detener trabajos ya finalizados" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "No se pueden detener trabajos en espera" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Ninguno" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formatos" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Libro <font face=\"serif\">%s</font> de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doble click para <b>editarme</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Tamaño (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Fecha" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Valoración" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Ruta" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Marca de tiempo" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" "Búsqueda (Para Busqueda Avanzada, haga click en el boton de la izquierda)" @@ -2283,15 +2378,15 @@ msgstr "Partición de palabras" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Los cambios no se aplicaran hasta reiniciar." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - Visor de LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>No </b>se han encontrado coincidencias para \"<i>%s</i>\"." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "No se han encontrado coincidencias" @@ -2335,11 +2430,11 @@ msgstr "Abrir eBook" msgid "Configure" msgstr "Configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Error en la comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2347,31 +2442,31 @@ msgstr "" "<p>Para mas ayuda, visite <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Enviar a la memoria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Envia a la targeta de memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Editar metadatos individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Edita metadatos en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "añadir libros desde un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2379,7 +2474,7 @@ msgstr "" "Añadir libros de manera recursiva (un libro por directorio, asumiendo que " "cada archivo del directorio es el mismo libro en diferente formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2387,49 +2482,49 @@ msgstr "" "Añadir libros de manera recursiva (Multiples libros por directorio, " "asumiendo que cada archivo es un libro diferente)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Guardar en el disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Guardar en el disco, en un único directorio" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Mostrar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Ver formato específico" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Convertir individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Convertir en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " detectado." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Conectado " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Base de datos del dispositivo corrupta" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2459,8 +2554,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2468,52 +2563,52 @@ msgstr "" "<p>Ya existen libros con el mismo título en la base de datos. ¿Añadirlo de " "todas formas?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "¡Duplicados encontrados!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "No hay espacio en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>No se pueden guardar los libros porque no hay espacio en el dispositivo " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Eliminando libros del dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "No se pueden editar los metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "No hay libros seleccionados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Enviando libros al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "No hay formatos adecuados" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2521,68 +2616,68 @@ msgstr "" "No se pudieron enviar los siguientes libros al dispositivo, ya que no se " "hallaron formatos adecuados: <br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "No se puede guardar en disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Busca noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Buscando noticias de " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Noticias adquiridas. Enviando al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "No se puede convertir" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Comenzando conversión en lote de %d libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Seleccione un libro" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "No se puede visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Elija el formato para visualizar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s no tiene formatos disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "No se puede configurar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "No se puede configurar con trabajos en proceso." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Copiando base de datos a " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Base de datos no valida" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2590,24 +2685,24 @@ msgstr "" "<p>Ya existe una base de datos no valida en %s, bórrela antes de intentar " "mover la base de datos existente. <br>Error: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "No se puede mover la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "No hay información detallada disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" "No hay información detallada disponible para los libros en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Error de comunicación con el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2615,15 +2710,15 @@ msgstr "" "Hubo un error de comunicación con el dispositivo. Desconecte, vuelva a " "conectar el dispositivo y reinicie la aplicación." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Error de conversión" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "No existe la base de datos" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2631,7 +2726,7 @@ msgstr "" "El directorio en el que se debería encontrar la base de datos, %s ya no " "existe. Por favor seleccióne una nueva ruta para la base de datos." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2639,7 +2734,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Última versión: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2649,27 +2744,27 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuevas " "características</a>. Visita la página de descarga?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Actualización disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Búsqueda avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Buscar:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2677,7 +2772,7 @@ msgstr "" "Busca libros por título o autor. <br><br>Los espacios entre palabras se " "sustituyen por AND." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2685,63 +2780,76 @@ msgstr "" "Buscar libros por título, autor, editorial, etiquetas y " "comentaris<br><br>Los espacios entre parlabras se sustituyen por AND." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Reinicializar búsqueda rápida" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Añadir libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Suprimir libros" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Borrar" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Editar la meta-información" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Enviar al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Descargar noticias (RSS)" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Convertir Ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" +"Redireccionar salida de consola hacia una ventana de diálogo (ambas stdout " +"and stderr). Útil en windows, donde las aplicacines en GUI no tienen cadenas " +"de salida." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "ERROR: Excepción no Contemplada" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Añadir nueva fuente de noticias" @@ -2791,11 +2899,11 @@ msgstr "Expresión regular no válida" msgid "Invalid regular expression: %s" msgstr "Expresión regular no valida: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2803,7 +2911,7 @@ msgstr "" "Sony Reader\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2811,21 +2919,21 @@ msgstr "" "Tarjeta\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Haga click para ver la lista de libros disponibles en su ordenador" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "Haga click para ver la lista de libros disponibles en su lector" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Haga click para ver la lista de libros en la tarjeta de almacenamiento de su " "lector" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2833,7 +2941,7 @@ msgstr "" "Camino a la base de datos calibre. El valor predeterminado es a usar la ruta " "almacenada en la configuración." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2843,26 +2951,33 @@ msgstr "" "\n" "Mostrar los libros disponibles en la base de datos calibre. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" "Available fields: %s\n" "Default: %%default" msgstr "" +"Campos a mostrar cuando se listan libros de la Base de Datos. Tienen que " +"estar separados por comas.\n" +"Campos disponibles: %s\n" +"Defecto: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" +"Campos por los que ordenar el resultado.\n" +"Campos disponibles: %s\n" +"Defecto: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Clasificar los resultados en orden ascendente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2872,15 +2987,15 @@ msgstr "" "consulta de búsqueda consulte la documentación relacionada con la búsqueda " "en el Manual del usuario. El valor predeterminado es a no hacer el filtrado." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Campos no válidos. Los campos disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Campo de clasificación no válido. Los campos disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2888,7 +3003,7 @@ msgstr "" "Los siguientes libros no se han añadido como ya existen en la base de datos " "(véase la opción --duplicates)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2903,7 +3018,7 @@ msgstr "" "directorios, consulte las opciones relacionadas a los directorios más abajo. " "\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2911,11 +3026,11 @@ msgstr "" "Supongamos que cada directorio tiene un solo libro lógico y que todos los " "archivos en este directorio son diferentes formatos de este libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Proceso de directorios recursivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2923,11 +3038,11 @@ msgstr "" "Añadir a base de datos de libros, aunque ya existen. La comparación se " "realiza sobre la base de títulos de libros." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "Debe especificar al menos un archivo para añadir" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2942,11 +3057,11 @@ msgstr "" "números de identificación utilizando el commando \"list\"). Por ejemplo, " "23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Debe especificar al menos un libro para eliminar" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2955,15 +3070,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "Debe especificar un ID y un ebook archivo" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "ebook archivo debe tener una extensión" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2980,11 +3095,86 @@ msgstr "" "archivo como LRF o TXT o EPUB. Si el libro lógico no tiene fmt disponible, " "no hacer nada.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Debe especificar un ID y un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metadata [options] id\n" +"Muestra los metadatos almacenados en la Base de Datos de calibre para el " +"libro identificado por ID.\n" +"Id es un número de identificador de la lista de comandos. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Imprimir metadatos en formato OPF (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "Usted debe especificar un ID" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "Usted debe especificar un ID y un archivo de metadatos" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" +"Exportar todos los libros en la base de datos, haciendo caso omiso de la " +"lista de identificaciones." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" +"Exportar libros para el directorio especificado. El valor por defecto es" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Exportar todos los libros en un solo directorio" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Crear nombres de archivo como autor - título en lugar de título - autor" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "Debe especificar algunas identificaciones o la opción %s" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2996,11 +3186,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Trabajo detenido por el usuario" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "No se ha podido abrir el proceso trabajador." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "No se ha podido inicializar la biblioteca fontconfig" @@ -3026,7 +3216,7 @@ msgid "Unknown feed" msgstr "Newsfeed desconocido" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artículo sin título" @@ -3219,7 +3409,8 @@ msgid "" "%s" msgstr "" "\n" -"Artículo %s descargado desde %s" +"Artículo %s descargado desde %s\n" +"%s" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 msgid "Article downloaded: %s" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 7454c5abe2..3c9a04be89 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-05-24 06:22+0000\n" -"Last-Translator: FixB <Unknown>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-27 10:35+0000\n" +"Last-Translator: Pierre Slamich <pierre.slamich@gmail.com>\n" "Language-Team: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -33,6 +33,12 @@ msgstr "" #~ "Une expression régulière. Les tags <a> qui respectent cette expression " #~ "seront ignorés. Par défaut : %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Empêche l'insertion automatique d'un saut de page avant chaque chapitre " +#~ "détecté." + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -56,6 +62,9 @@ msgstr "" #~ msgid "Server error. Try again later." #~ msgstr "Erreur Serveur. Veuillez essayer ultérieurement." +#~ msgid "&Access Key;" +#~ msgstr "&Access Key;" + #~ msgid "%s is not available in LRF format. Please convert it first." #~ msgstr "%s n'est pas disponible au format LRF. Veuillez le convertir avant." @@ -164,11 +173,11 @@ msgstr "" #~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" #~ "family:'Sans Serif';\"></p></body></html>" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Créé par " @@ -191,8 +200,12 @@ msgstr "" "Par défaut : %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Inconnu" @@ -215,7 +228,7 @@ msgstr "Clé de tri pour l'auteur" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editeur" @@ -317,7 +330,7 @@ msgid "" "HTML or CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " @@ -327,23 +340,35 @@ msgstr "" "paramètres comme la résolution et la taille de l'écran du lecteur. Par " "défaut : %s Profils supportés : " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "La marge de gauche. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "La marge de droite. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "La marge de haut de page. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "La marge de bas de page. Par défaut : %default points." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that <a> tags are " @@ -353,24 +378,21 @@ msgstr "" "indique qu'aucun lien ne sera traité. Une valeur négative indique que les " "tags <a> sont ignorés." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 -msgid "Don't add links to the table of contents." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Empêche l'insertion automatique d'un saut de page avant chaque chapitre " -"détecté." +msgid "Don't add links to the table of contents." +msgstr "Ne pas ajouter de liens à la table des matières." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -379,7 +401,15 @@ msgstr "" "expression rest recherchée dans les tags d'en-têtes (h1-h6). Par défaut : " "%default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -398,12 +428,12 @@ msgstr "" "page. De ce fait, cette option est ignorée si la page courante a peu " "d'éléments." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -416,16 +446,16 @@ msgstr "" "de classe \"chapter\" il faudrait saisir : \"h\\d,class,chapter\". Par " "défaut : %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." -msgstr "" +msgstr "Ajouter les chapitres détectés à la table des matières." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Préprocesse les fichiers HTML Bean pour améliorer le fichier LRF généré." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -433,12 +463,12 @@ msgstr "" "Vous devez utiliser cette option pour traiter des fichiers générés par " "pdftohtml, sinon la conversion échouera." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" "Utilisez cette option sur des fichiers html0 venant de Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -446,27 +476,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "La famille de police serif à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "La famille de police sans-serif à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "La famille de police monospace à inclure" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -475,7 +505,7 @@ msgstr "" "long. N'utilisez cette option que si vous avez des problèmes de mémoire " "disponible." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -521,105 +551,105 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 msgid "Options to control the behavior of feeds2disk" -msgstr "" +msgstr "Options pour contrôler le comportement de feeds2disk" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:24 msgid "Options to control the behavior of html2lrf" -msgstr "" +msgstr "Options pour contrôler le comportement de html2lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:46 msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" -msgstr "" +msgstr "%s est un fichier vide" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -895,19 +925,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -915,18 +945,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Commentaires" @@ -953,33 +983,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Doit être un répertoire." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Chemin de la database invalide " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Chemin de la database invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Chemin de la database invalide.<br>Erreur en écriture " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuration" @@ -994,21 +1024,21 @@ msgstr "Choisir un nouvel emplacement pour la base de données" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1092,9 +1122,9 @@ msgid "ERROR" msgstr "ERREUR" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Auteur(s)" @@ -1106,19 +1136,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Impossible de se connecter" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "Vous devez spécifier une clef d'accès valide à isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1141,8 +1175,8 @@ msgstr "" "(access key)." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Access Key;" +msgid "&Access Key:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1159,7 +1193,7 @@ msgstr "" "Sélectionnez le livre qui correspond le mieux au votre dans la liste ci-" "dessous." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -1167,6 +1201,10 @@ msgstr "" msgid "Unavailable" msgstr "Indisponible" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Exécutions en cours" @@ -1175,74 +1213,74 @@ msgstr "Exécutions en cours" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Présentation" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Mise en page" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Détection des chapitres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Aucun format disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Conversion du livre %s impossible parcequ'il ne dispose d'aucun format " "supporté" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Choix du format de conversion vers LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Conversion de %s en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Définir les paramètres par défaut de conversion" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Impossible de lire" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Vous n'avez pas les permissions nécessaires pour lire ce fichier: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Erreur à la lecture du fichier" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Il y a eu une erreur à la lecture du fichier : <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " n'est pas une image vailde" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1250,23 +1288,23 @@ msgstr "" "Pré-processe le fichier avant la conversion vers le format LRF. Ceci est " "utile si vous connaissez l'origine du fichiers. Origines connues :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> -Livres des éditions BAEN </li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - fichiers HTML générés par le programme pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" "<li><b>book-designer</b> - Fichiers HTML0 générés avec Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1274,7 +1312,7 @@ msgstr "" "Définit les metadata comme le titre et l'auteur du livre.<p>Les metadata " "seront modifiées dans la base de données et dans le fichier LRF généré." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1282,7 +1320,7 @@ msgstr "" "Ajuste la présentation du fichier LRF généré en définissant des paramètres " "tels que la taille des polices et l'espacement entre les mots." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1290,69 +1328,69 @@ msgstr "" "Définit les paramètres de la pages tels que les marges et la taille de " "l'écran du lecteur cible." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Peaufiner la détection des chapitres et des en-têtes de section." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Aucune aide n'est disponible</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Convertir en LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Catégorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Options" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Couverture du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Modifie l'image &cover :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Rechercher une image à utiliser en tant que couverture du livre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Utilise l'image de couverture du fichier &source" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titre : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Modifie le titre du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Auteurs : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1360,30 +1398,30 @@ msgstr "" "Modifie les auteurs du livres. Si plusieurs auteurs, les séparer avec des " "virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "T&ri de l'auteur :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editeur : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Modifie l'éditeur du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Ta&gs : " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1391,183 +1429,195 @@ msgstr "" "Tags caractérisant le livre, particulièrement utile pour la recherche. <br> " "<br> Cela peut être n'importe quels mots, séparés par des virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Séries :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Liste de séries connues. Vous pouvez ajouter de nouvelles séries." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Index de séries" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Livre " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Taille de &police par défaut :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Polices inclues" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "Espacement entre &mots :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "Active l'auto &rotation des images" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Insère des lignes &blanches entre les paragraphes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignore les &tables" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocess :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "En-têtre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "&Affiche l'en-tête" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "Format de l'&en-tête" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "Surcharge <br> CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "&Profil :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Marge &Gauche :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "Marge &Droite :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "Marge &Haute :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "Marge &Basse :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Détection basée sur les titres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "&Désactive la détection de chapitres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "Expression &Régulière :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Détection basée sur des tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "Saut de &page avant le tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Force un saut de page avant le tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "Force un saut de page avant l'&attribut :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Aide" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1578,17 +1628,17 @@ msgid "Edit Meta information" msgstr "Editer les informations Metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Informations (metadata)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "Clé de tr&i de l'auteur : " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1597,19 +1647,19 @@ msgstr "" "Dickens peut être classé comme Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Note :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Note de ce livre. de 0 à 5 étoiles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " étoiles" @@ -1651,51 +1701,51 @@ msgstr "Erreur à la récupération de l'image de couverture" msgid "You must specify the ISBN identifier for this book." msgstr "Vous devez fournir l'identifiant ISBN de ce livre." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Edition des metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Ouvre l'éditeur de mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "I&SBN :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "Récupération des metadata depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "Ajout d'un nouveau format dans la base de données pour ce livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Retire les formats sélectionnés de ce livre de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Récupération de l'image de couverture depuis le serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Modifie le nom d'utilisateur et/ou le mot de passe de votre compte à " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Modifie le mot de passe" @@ -1724,13 +1774,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Séries" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1761,39 +1811,39 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editeur de Mots-Clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Mots-clefs disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1801,29 +1851,29 @@ msgstr "" "Supprime un mot-clef de la base de données. Cette opération va retirer ce " "mot-clef de tous les livres et le supprimer de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Applique le mot-clef au livre en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Enlève le mot-clef du livre en cours" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Ajoute mot-clef" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Ajoute le mot-clef à la liste des mots-clefs et l'applique au livre en cours" @@ -1841,95 +1891,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1943,62 +1993,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -2077,106 +2127,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Travaux" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Statut" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progression" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "En attente" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "En cours" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Aucun" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tags" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formats" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Livre <font face=\"serif\">%s</font> of %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Taille (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Date" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Note" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Chemin" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Horodatage" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -2198,15 +2248,15 @@ msgstr "" "<b>Les modifications ne seront prises en compte qu'après avoir relancé le " "programme." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Aucun résultat</b> pour la recherche <i>%s</i>." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Aucun résultat" @@ -2250,95 +2300,95 @@ msgstr "Ouvrir le livre" msgid "Configure" msgstr "Configuration" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Envoi vers la mémoire du lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Envoi vers la carte mémoire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Edition des metadata individuellement" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Edition des metadata par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Convertion individuelle" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Convertion par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2354,8 +2404,8 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2363,120 +2413,120 @@ msgstr "" "<p>Des livres ayant le même titre existent déjà dans la base de données. Les " "ajouter quand même ?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Des doublons ont été détectés !" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Impossible d'envoyer les livres sur le lecteur : il n'y a plus assez " "d'espace mémoire disponible " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Erreur à l'édition des metadat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Ne peut pas enregistrer sur le disque" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Conversion impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Impossible de visualiser" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Configuration impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Impossible de configurer pendant que des travaux sont en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Base de données invalide" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2484,23 +2534,23 @@ msgstr "" "<p>Une base de données invalide existe déjà ici : %s, spprimez la avant " "d'essayer de déplacer la base de données existante.<br>Erreur : %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Déplacement de la base de données impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2509,54 +2559,54 @@ msgstr "" "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "électronique et redémarrer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Recherche :" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2564,7 +2614,7 @@ msgstr "" "Recherche les livres par titre ou auteur <br><br>Recherche en ET pour les " "mots séparés par des espaces." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2572,63 +2622,73 @@ msgstr "" "Recherche les livres par titre, auteur, éditeur, tags et commentaires " "<br><br>Recherche en ET pour les mots séparés par des espaces." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Réinitialisation de la recherche rapide" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Ajout d'un livre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Suppression du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Suppression" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Edition des metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Envoyer au lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Récupérer des News" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Convertir des ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2673,11 +2733,11 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Librairie" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2685,7 +2745,7 @@ msgstr "" "Lecteur \n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2693,32 +2753,32 @@ msgstr "" "Carte\n" "%s disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2726,39 +2786,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2767,27 +2827,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2796,11 +2856,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2809,15 +2869,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2827,11 +2887,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2843,11 +2969,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2873,7 +2999,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 445a32c0e7..408988bb55 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-12 22:40+0000\n" -"Last-Translator: S. Dorscht <Unknown>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 20:27+0000\n" +"Last-Translator: Iacopo Benesperi <Unknown>\n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -36,6 +36,12 @@ msgstr "" #~ "Un'espressione regolare. I tag <a> i cui href corrispondono verranno " #~ "ignorati. Predefinita: %default" +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Previene l'inserimento automatico di interruzioni di pagina prima dei " +#~ "capitoli individuati" + #~ msgid "" #~ "Force a page break before tags whoose names match this regular expression." #~ msgstr "" @@ -60,6 +66,12 @@ msgstr "" #~ msgid "The author whoose book to search for." #~ msgstr "L'autore del libro da cercare" +#~ msgid "&Access Key;" +#~ msgstr "&Chiave d'accesso;" + +#~ msgid "Job killed by user" +#~ msgstr "Lavoro terminato dall'utente" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -67,11 +79,34 @@ msgstr "" #~ "Salvare il testo sottostante in un file di nome recipe.py e mandaro ai " #~ "propri amici, in modo da permettergli di usare questa formula." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sUso%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Creato da " @@ -94,8 +129,12 @@ msgstr "" "Predefinito: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Sconosciuto" @@ -118,7 +157,7 @@ msgstr "Chiave per la classificazione dell'autore" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Editore" @@ -230,7 +269,7 @@ msgstr "" "Trasforma tutto il contenuto in bianco e nero al posto dei colori " "specificati dall'HTML o dal CSS." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " @@ -240,23 +279,39 @@ msgstr "" "determina parametri come la risoluzione e la dimensione dello schermo del " "dispositivo. Predefinito: %s. Profili supportati: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Margine sinistro della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Margine destro della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Margine superiore della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Margine inferiore della pagina. Predefinito: %default px" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" +"Trasforma in immagini le tabelle di HTML (utile se il documento ha tabelle " +"grandi o complesse)" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" +"Moltiplica la dimensione del testo nelle tabelle trasformate di questo " +"fattore. Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that <a> tags are " @@ -266,7 +321,7 @@ msgstr "" "0 significa che i link non vengono seguiti. Un valore negativo significa che " "i tag <a> vengono ignorati" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -274,18 +329,15 @@ msgstr "" "Un'espressione regolare. I tag <a> i cui href corrispondono verranno " "ignorati. Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Non aggiungere link al sommario." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Previene l'inserimento automatico di interruzioni di pagina prima dei " -"capitoli individuati" - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Previene l'individuazione automatica dei capitoli." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -293,7 +345,20 @@ msgstr "" "L'espressione regolare utilizzata per individuare i titoli dei capitoli. I " "titoli vengono cercati nei tag d'intestazione (H1-H6). Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" +"Individua l'inizio di un capitolo con un tag che ha l'attributo specificato. " +"Il formato di questa opzione è regexp nome tag,nome attributo,regexp valore " +"attributo. Ad esempio per far corrispondere tutti i tag di intestazione che " +"hanno l'attributo class=\"capitolo\", bisogna usare \"h\\d,class,capitolo\". " +"Predefinito: %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -312,14 +377,14 @@ msgstr "" "degradano le prestazioni dell'LRF nel girare la pagina. Questa opzione viene " "perciò ignorata se la pagina corrente ha solo pochi elementi" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Forza un'interruzione di pagina prima dei tag i cui nomi corrispondono a " "questa espressione regolare" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -332,15 +397,15 @@ msgstr "" "tutti i tag intestazione che hanno l'attributo class=\"chapter\" bisogna " "usare \"h\\d,class,chapter\". Predefinita: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "Aggiungi i capitoli individuati al sommario." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "Preprocessa i file HTML di Baen per migliorare i file LRF generati" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -348,11 +413,11 @@ msgstr "" "È necessario aggiungere questa opzione se si stanno processando file " "generati da pdftohtml, altrimenti la conversione non riuscirà" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Usare questa opzione sui file html0 di Book Designer" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -365,27 +430,27 @@ msgstr "" "nel girare le pagine. Ad esempio: --serif-family \"Times New Roman\"\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "La famiglia di caratteri con grazie da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "La famiglia di caratteri senza grazie da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "La famiglia di caratteri a spaziatura fissa da includere" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Prolisso durante il processamento" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Converte in LRS" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -393,7 +458,7 @@ msgstr "" "Minimizza l'uso di memoria al costo di un maggior tempo di processamento. " "Usare questa opzione se si è su una macchina a corto di memoria" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -467,56 +532,56 @@ msgstr "Opzioni per controllare il comportamento di html2lrf" msgid "Fetching of recipe failed: " msgstr "Scaricamento della formula fallito: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tFile di Book Designer individuato" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalisi HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tFile di Baen individuato. Rianalizzo..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "HTML preprocessato scritto in " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Sto processando %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConversione in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Impossibile analizzare il file: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%S è un file vuoto" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Analisi fallita del link %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Impossibile aggiungere il link %s alla TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Impossibile processare l'immagine %s. Errore: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Impossibile processare la PNG interlacciata %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -524,14 +589,14 @@ msgstr "" "Impossibile processare l'immagine: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Si è verificato un errore nel processamento della tabella: %s. Ignoro il " "codice della tabella" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -539,11 +604,11 @@ msgstr "" "Tabella malformata:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "La tabella ha celle troppo larghe" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -551,19 +616,19 @@ msgstr "" "È necessario prima salvare il sito web %s come un file HTML e poi eseguire " "html2lrf su di esso" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Impossibile leggere l'immagine di copertina: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Impossibile leggere da: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Processamento del file OPF fallito" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -603,7 +668,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:133 msgid "Output LRS file" -msgstr "Estrae un file LRS" +msgstr "Restituisce un file LRS" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:151 msgid "Parsing LRF..." @@ -897,19 +962,19 @@ msgstr "Uso: pdf-meta-file.pdf" msgid "No filename specified." msgstr "Nessun nome file specificato" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opzioni] miolibro.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Cartella in uscita. Predefinita: cartella corrente" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "MOBI HTML raw salvato in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "Libro OEB creato in" @@ -917,18 +982,18 @@ msgstr "Libro OEB creato in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titolo" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Commenti" @@ -955,33 +1020,33 @@ msgstr "Base" msgid "Advanced" msgstr "Avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Deve essere una cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Percorso database non valido " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Percorso database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Percorso database non valido.<br>Impossibile scrivere su " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Compattamento database. Poterbbe richiedere un po' di tempo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Compattamento..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configurazione" @@ -996,21 +1061,21 @@ msgstr "Sfoglia per specificare una nuova posizione del database" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1095,9 +1160,9 @@ msgid "ERROR" msgstr "ERRORE" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autore(i)" @@ -1109,20 +1174,24 @@ msgstr "Classificazione autore" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Impossibile connettersi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" "È necessario specificare delle chiavi d'accesso valide per isbndb.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Errore nello scaricamento dei metadati" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Messun metadato trovato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1147,8 +1216,8 @@ msgstr "" "d'accesso." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Chiave d'accesso;" +msgid "&Access Key:" +msgstr "&Chiave d'accesso:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1165,7 +1234,7 @@ msgstr "" "Selezionare il libro che corrisponde maggiormente alla propria copia " "dall'elenco sottostante" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Dettagli del lavoro" @@ -1173,6 +1242,10 @@ msgstr "Dettagli del lavoro" msgid "Unavailable" msgstr "Non disponibile" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - Lavori" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Lavori attivi" @@ -1181,73 +1254,73 @@ msgstr "Lavori attivi" msgid "&Stop selected job" msgstr "I&nterrompi il lavoro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Visualizzazione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Imposta pagina" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Individuazione capitoli" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Nessun formato disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Impossibile convertire %s perché questo libro non ha formati supportati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Scegliere il formato da convertire in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Converte %s in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Impostazioni di conversione predefinite" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Impossibile leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Non si hanno i permessi per leggere il file: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Errore nella lettura del file" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Si è verificato un errore nella lettura del file: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " non è un'immagine valida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1255,22 +1328,22 @@ msgstr "" "Preprocessa il file prima di convertirlo in LRF. È utile se si conosce la " "fonte da cui proviene il file. Fonti conosciute:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Libri dall'editore BAEN</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" "<li><b>pdftohtml</b> - File HTML generati dal programma pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - File HTML0 da Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1278,7 +1351,7 @@ msgstr "" "Specifica metadati come il titolo e l'autore del libro.<p>I metadati saranno " "aggiornati nel database e nel file LRF generato" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1286,7 +1359,7 @@ msgstr "" "Aggiusta la visualizzazione del file LRF generato specificando parametri " "come la dimensione dei caratteri e la spaziatura tra le parole" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1294,72 +1367,72 @@ msgstr "" "Specifica le impostazioni della pagina come i margini e la dimensione dello " "schermo del dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" "Mette a punto in modo fine l'individuazione delle intestazioni dei capitoli " "e delle sezioni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Nessun aiuto disponibile</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Conversione in gruppo di libri in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Converti in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categoria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opzioni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Copertina del libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Ca&mbia l'immagine di copertina:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" "Sfoglia per trovare un'immagine da usare come copertina per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Usa copertina del file di &origine" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titolo: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Cambia il titolo di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "A&utore(i): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1367,30 +1440,30 @@ msgstr "" "Cambia l'autore di questo libro. Autori multipli devono essere separati da " "una virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "Classifica&zione autore:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Editore: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Cambia l'editore di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "T&ag: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1399,183 +1472,196 @@ msgstr "" "ricerche. <br>Possono essere qualsiasi parola o frase, separati da una " "virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Serie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Lista di serie conosciute. È possibile aggiungere nuove serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Indice serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Libro " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "&Grandezza caratteri di base:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Caratteri inclusi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Con grazie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "&Senza grazie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Dimensione fissa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "C&odifica sorgente:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "I&ndentazione minima:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "Spaziat&ura caratteri:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "Abilita &rotazione automatica delle immagini" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Ins&erisci linee bianche tra i paragrafi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Ignora ta&belle" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Ignor&a colori" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Preprocessamento:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "Intestazione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "&Mostra intestazione" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "&Formato intestazione:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "Sovrascrivi<br>CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "&Profilo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "Margine &sinistro:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "Margine &destro:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "Margine s&uperiore:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "Margine i&nferiore:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "&Converti tabelle in immagini (utile per tabelle grandi/complesse)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" +"&Moltiplicatore per la dimensione del testo nelle tabelle trasformate:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Individuazione basata sul titolo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "&Disabilita l'individuazione del capitoli" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "&Espressione regolare:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "Aggiungi i &capitoli al sommario" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "Non aggiungere li&nk al sommario" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Individuazione basata sui tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "I&nterruzione di pagina prima del tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "&Forza interruzione di pagina prima del tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "Forza interruzione di pagina prima dell'&attributo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "Indi&vidua capitolo col tag:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Aiuto per l'elemento" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1585,8 +1671,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1596,17 +1682,17 @@ msgid "Edit Meta information" msgstr "Modifica metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Metadati" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "&Classificazione autore: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1615,19 +1701,19 @@ msgstr "" "esempio, Charles Dickens deve essere classificato come Dickens, Charles." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Giudizio:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Giudizio su questo libro. 0-5 stelle" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " stelle" @@ -1669,50 +1755,50 @@ msgstr "Impossibile scaricare la copertina" msgid "You must specify the ISBN identifier for this book." msgstr "È necessario specificare il codice ISBN di questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Modifica metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Apri l'editor dei tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Rimuovi serie inutilizzate (che non hanno libri)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "Scarica metadati dal server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Formati disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "Aggiungi un nuovo formato al database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Rimuovi il formato selezionato dal database per questo libro" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Scarica immagine di copertina dal server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Cambia il nome utente e/o password del proprio account su LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Cambia password" @@ -1741,13 +1827,13 @@ msgid "Tag" msgstr "Tag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formato" @@ -1780,39 +1866,39 @@ msgstr "" msgid "Negate" msgstr "Nega" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Ricerca avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "&Corrispondenza con tutti i criteri seguenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "C&orrispondenza con uno qualunque dei criteri seguenti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Criteri di ricerca" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Di più" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Meno" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Editor di tag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "Tag &disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1820,23 +1906,23 @@ msgstr "" "Rimuovi il tag dal database. Questa operazione rimuoverà il tag da tutti i " "libri e poi dal database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Applica il tag al libro corrente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "&Tag applicati" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Rimuovi il tag dal libro corrente" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "&Aggiungi tag:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1844,7 +1930,7 @@ msgstr "" "Se il tag voluto non è nella lista di quelli disponibili, è possibile " "aggiungerlo qui. Accetta una lista di tag separati da virgola" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "Aggiungi il tag a quelli disponibili e applicalo al libro corrente" @@ -1861,95 +1947,95 @@ msgid "Recipe for " msgstr "Formula per " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "Passa alla modalità avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Passa alla modalità base" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Il feed deve avere un titolo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Il feed deve avere un titolo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Il feed deve avere una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "Il feed %S deve avere una URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Esiste già" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Questo feed è già stato aggiunto alla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Input non valido" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Input non valido" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Impossibile creare la formula. Errore:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Sovrascrivere la formula?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "Esiste già una formula personalizzata di nome %s. Sovrascriverla?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Scegliere un file di formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Formule" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Aggiungi una fonte di notizie personalizzata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Formule utente disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Aggiungi/Aggiorna for&mula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Rimuovi formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "Condi&vidi formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "Carica formula &da file" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1973,56 +2059,56 @@ msgstr "" "parte dei feed, bisognerà usare la \"Modalità avanzata\" per personalizzare " "ulteriormente il processo di scaricamento.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Titolo formula:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "Arti&colo più vecchio:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "L'articolo più vecchio da scaricare" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " giorni" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Numero massimo di articoli per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Massimo numero di articoli da scaricare per feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feed nella formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Rimuove il feed dalla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Aggiunge il feed alla formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "Tit&olo del feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "&URL del feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "&Aggiungi feed" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2031,7 +2117,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Formule " "utente</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Codice sorgente formula (python)" @@ -2116,45 +2202,45 @@ msgstr "Nome del gruppo per l'espressione regolare (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Lavoro" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Stato" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Progresso" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Tempo di esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Errore" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Finito" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "In attesa" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "In esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "Impossibile terminare il lavoro" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2162,62 +2248,62 @@ msgstr "" "Impossibile terminare i lavori che stanno comunicando col dispositivo dato " "che potrebbe causare una corruzione dei dati" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Impossibile terminare i lavori già completati" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Impossibile terminare i lavori in attesa" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Nessuno" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tag" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formati" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Libro <font face=\"serif\">%s</font> di %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doppio clic per modificarmi" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Dimensione (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Data" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Giudizio" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Percorso" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Timestamp" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Cerca (Per la ricerca avanzata fare clic sul bottone a sinistra)" @@ -2237,15 +2323,15 @@ msgstr "Unisci" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Le modifiche avranno effetto dopo il riavvio" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - Lettore LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Nessuna corrispondenza</b> trovata per la frase <i>%s</i>" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Nessuna corrispondenza trovata" @@ -2289,11 +2375,11 @@ msgstr "Apri libro" msgid "Configure" msgstr "Configurazione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2301,31 +2387,31 @@ msgstr "" "<p>Per aiuto visitare <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s di <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Invia alla memoria principale" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Invia alla scheda di memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Modifica metadati individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Modifica metadati in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Aggiungi libri da una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2333,7 +2419,7 @@ msgstr "" "Aggiungi libri ricorsivamente (un libro per cartella, assume che ogni file " "sia lo stesso libro in un diverso formato)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2341,49 +2427,49 @@ msgstr "" "Aggiungi libri ricorsivamente (più libri per cartella, assume che ogni file " "sia un libro diverso)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Salva su disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Salva su disco in una singola cartella" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Leggi" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Leggi uno specifico formato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Converti individualmente" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Converti in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " individuato." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Connesso " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Database del dispositivo corrotto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2412,8 +2498,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2421,53 +2507,53 @@ msgstr "" "<p>Nel database sono già presenti libri con i seguenti titoli. Aggiungerli " "ugualmente?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Scoperti duplicati!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Caricamento libri nel dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Spazio insufficiente sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Impossibile salvare libri sul dispositivo perché non c'è più spazio " "disponibile " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Cancellamento libri dal dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Impossibile modificare i metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Invio libri al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Nessun formato adatto" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2475,68 +2561,68 @@ msgstr "" "Impossibile caricare i seguenti libri nel dispositivo, perché non è stato " "trovato nessun formato adatto:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Impossibile salvare sul disco" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Scarica notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Scaricamento notizie da " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Notizie scaricate. Salvataggio sul dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Impossibile convertire" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Avviamento conversione in gruppo di %d libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Nessun libro selezionato" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Impossibile leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Scegliere il formato da leggere" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s non ha formati disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Impossibile configurare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Impossibile configurare mentre ci sono lavori in esecuzione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Copiatura database in " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Database non valido" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2544,25 +2630,25 @@ msgstr "" "<p>Esiste già un database non valido in %s, eliminarlo prima di provare a " "spostare il database esistente.<br>Errore: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Impossibile spostare il database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Nessuna informazione dettagliata disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" "Non è disponibile alcuna informazione dettagliata per i libri nel " "dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Errore di comunicazione col dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2570,15 +2656,15 @@ msgstr "" "Si è verificato un errore di comunicazione temporaneo col dispositivo. " "Disconnettere e riconnettere il dispositivo e/o riavviare" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Errore di conversione" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "Il database non esiste" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2586,7 +2672,7 @@ msgstr "" "La cartella in cui il database dovrebbe essere: %s non esiste più. Scegliere " "una nuova posizione per il database." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2594,7 +2680,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Ultima versione: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2604,27 +2690,27 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nuove " "funzionalità</a>. Una visita alla pagina del download?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Aggiornamento disponibile" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Ricerca avanzata" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Cerca:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2632,7 +2718,7 @@ msgstr "" "Cerca nella lista dei libri per titolo o autore<br><br>Parole separate da " "spazi hanno come operatore AND" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2640,63 +2726,75 @@ msgstr "" "Cerca nella lista dei libri per titolo, autore, editore, tag e " "commenti<br><br>Parole separate da spazi hanno come operatore AND" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Resetta ricerca veloce" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Aggiungi libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Rimuovi libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Canc" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Modifica metadati" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Invia al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Scarica notizie" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Converti libri" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" +"Redireziona l'output della console a una finestra di dialogo (sia stdout ceh " +"stderr). Utile nelle finestre dove l'applicazione GUI non ha un output." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "ERRORE: eccezione non gestita" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Aggiungi una fonte di notizie personalizzata" @@ -2746,11 +2844,11 @@ msgstr "Espressione regolare non valida" msgid "Invalid regular expression: %s" msgstr "Espressione regolare non valida: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2758,7 +2856,7 @@ msgstr "" "Lettore\n" "%s disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2766,24 +2864,24 @@ msgstr "" "Scheda\n" "%s disponibili" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" "Fare clic per vedere la lista di libri disponibili sul proprio computer" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Fare clic per vedere la lista di libri nella memoria principale del proprio " "lettore" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Fare clic per vedere la lista di libri nella scheda di memoria del proprio " "lettore" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2791,7 +2889,7 @@ msgstr "" "Percorso al database di calibre. L'opzione predefinita è quella di usare il " "percorso salvato nelle opzioni." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2801,7 +2899,7 @@ msgstr "" "\n" "Mostra un elenco dei libri disponibili nel database di calibre. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2813,7 +2911,7 @@ msgstr "" "Campi disponibili: %s\n" "Predefinito: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2823,11 +2921,11 @@ msgstr "" "Campi disponibili: %s\n" "Predefinito: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Ordina i risultati in ordine crescente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2837,15 +2935,15 @@ msgstr "" "documentazione relativa alla ricerca nel Manuale Utente. L'opzione " "predefinita è quella di non filtrare." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Campi non validi. Campi disponibili:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Campo per l'ordinamento non valido. Campi disponibili:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2853,7 +2951,7 @@ msgstr "" "I seguenti libri non sono stati aggiunti perché già esistenti nel database " "(vedere l'opzione --duplicates):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2867,7 +2965,7 @@ msgstr "" "cartelle, leggere\n" "le opzioni dedicate alle cartelle in basso. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2875,21 +2973,21 @@ msgstr "" "Assume che ogni cartella abbia un solo libro logico e che tutti i file " "presenti siano diversi formati per quel libro" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Processa cartelle ricorsivamente" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "Aggiunge libri al database anche se esistono già." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "È necessario specificare almeno un file da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2903,11 +3001,11 @@ msgstr "" "separata da virgole di numeri id (è possibile ottenere i numeri id usando il " "comando list). Ad esempio: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "È necessario specificare almeno un libro da aggiungere" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2921,15 +3019,15 @@ msgstr "" "identificato da id. È possibile ottenere gli id usando il comando list. Se " "il formato esiste già, verrà sovrascritto.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "È necessario specificare un id e un file ebook" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "I file ebook devono avere un'estensione" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2946,11 +3044,102 @@ msgstr "" "file come LRF, TXT o EPUB. Se il libro logico non ha un fmt disponibile, non " "fa niente.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "È necessario specificare un id e un formato" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metedata [opzioni] id\n" +"\n" +"Mostra i metedati salvati nel database di calibre per il libro identificato " +"da id. \n" +"id è un numero id dalla lista dei comandi. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Stampa i metafati in formato OPF (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "È necessario specificare un id" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" +"\n" +"%prog set_metadata [opzioni] id /percorso/a/metadati.opf\n" +"\n" +"Imposta i metadati salvati nel database di calibre per il libro identificato " +"da id\n" +"presi dal file OPF metadati.opf. id è un numero id dalla lista dei comandi. " +"È \n" +"possibile farsi un'idea generale del formato OPF usando il parametro --as-" +"opf\n" +"nel comando show_metadata.\n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "È necessario specificare un id e un file di metadati" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" +"%prog export [opzioni] id \n" +"\n" +"Esporta i libri specificati da id (lista separata da virgole) nel " +"filesystem.\n" +"L'operazione di esportazione salva tutti i formati del libro, la sua " +"copertina\n" +"e i metadati (in un file opf). È possibile prendere i dumeri di id dalla " +"lista dei comandi. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "Esporta tutti i libri del database, ignorando la lista di id." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "Esporta i libri nella cartella specificata. Predefinita:" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Esporta tutti i libri in una singola cartell" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Crea i nomi dei file come \"autore - titolo\" invece di \"titolo - autore\"" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "È necessario specificare qualche id o l'opzione %s" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2966,11 +3155,11 @@ msgstr "" " \n" "Per aiuto su un singolo comando: %%prog comando --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Lavoro terminato dall'utente" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "Impossibile avviare il gestore dei lavori." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "Impossibile inizializzare la libreria fontconfig" @@ -2996,7 +3185,7 @@ msgid "Unknown feed" msgstr "Feed sconosciuto" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Articolo senza titolo" diff --git a/src/calibre/translations/nds.po b/src/calibre/translations/nds.po index 9e837a78bd..de93a7e477 100644 --- a/src/calibre/translations/nds.po +++ b/src/calibre/translations/nds.po @@ -5,16 +5,16 @@ # Kovid Goyal <kovid@kovidgoyal.net>, 2007, 2008. msgid "" msgstr "" -"Project-Id-Version: nds\n" +"Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-12 22:39+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 17:18+0000\n" "Last-Translator: S. Dorscht <Unknown>\n" -"Language-Team: nds\n" +"Language-Team: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -52,6 +52,12 @@ msgstr "" #~ msgid "The author whoose book to search for." #~ msgstr "Der Autor des gesuchten Buches." +#~ msgid "&Access Key;" +#~ msgstr "&Zugriffsschlüssel:" + +#~ msgid "Job killed by user" +#~ msgstr "Auftrag durch Benutzer abgebrochen" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -59,11 +65,34 @@ msgstr "" #~ "Speichern Sie den unten stehenden Text als Rezept.py Datei und senden Sie " #~ "die Datei an Freunde, damit sie dieses Rezept ebenfalls benutzen können." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sBenutzung%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Erstellt von " @@ -71,7 +100,7 @@ msgstr "Erstellt von " #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 msgid "Unable to detect the %s disk drive. Try rebooting." -msgstr "Konnte das %s Laufwerk nicht finden. Neustart versuchen." +msgstr "Konnte das Laufwerk %s nicht finden. Versuchen Sie einen Neustart." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 msgid "Set the title. Default: filename." @@ -86,8 +115,12 @@ msgstr "" "angegeben werden. Voreinstellung: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Unbekannt" @@ -110,7 +143,7 @@ msgstr "Sortierung nach Autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Herausgeber" @@ -169,7 +202,7 @@ msgstr "Paragraphen durch Leerzeilen trennen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:107 msgid "Add a header to all the pages with title and author." -msgstr "Kopfzeile mit Titel und Autornamen für alle Seiten einfügen." +msgstr "Kopfzeile mit Titel und Autor für alle Seiten einfügen." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:109 msgid "" @@ -222,7 +255,7 @@ msgid "" msgstr "" "Inhalt schwarz-weiß rendern anstatt in den in HTML oder CSS angegeben Farben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " @@ -232,23 +265,39 @@ msgstr "" "unter anderem die Auflösung und die Bildschirmgröße des Zielgerätes fest. " "Voreinstellung: %s Unterstützte Profile: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "Linker Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "Rechter Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "Oberer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "Unterer Rand der Seite. Die Voreinstellung ist %default Pixel." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" +"Tabellen in HTML als Bilder rendern (hilfreich, wenn das Dokument große oder " +"komplexe Tabellen enthält)" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" +"Textgröße in gerenderten Tabellen um diesen Faktor erhöhen. Voreinstellung " +"ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that <a> tags are " @@ -258,26 +307,23 @@ msgstr "" "dass Verknüpfungen ignoriert werden. Ein negativer Wert bedeutet, dass alle " "<a> Elemente ignoriert werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -"Ein regulärer Ausdruck. <a> tags, deren Verknüpfungen ignoriert werden. " +"Ein regulärer Ausdruck. <a> Elemente, deren Verknüpfungen ignoriert werden. " "Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Keine Links zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Automatisches Einfügen von Seitenumbrüchen vor ermittelten Kapiteln " -"verhindern." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "Automatische Erkennung von Kapiteln verhindern." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" @@ -285,7 +331,20 @@ msgstr "" "Der reguläre Ausdruck zur Ermittlung von Kapitelüberschriften. Es wird nach " "mit (h1) - (h6) angegebenen Überschriften gesucht. Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" +"Erkenne einen Kapitelanfang anhand des Elements mit dem angegebenen " +"Attribut. Das Format dieser Option ist tagname regexp,attribute " +"name,attribute value regexp. Um zum Beispiel alle \"header\" (\"h\") " +"Elemente mit dem Attribut class=\"chapter\" anzugleich, müsste man \"h\\" +"d,class,chapter\" benutzen. Voreinstellung ist %default" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -304,14 +363,14 @@ msgstr "" "Umblättern der in der LRF Datei verlangsamt. Diese Einstellung wird " "ignoriert, wenn die aktuelle Seite nur wenige Elemente enthält." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" "Seitenumbruch erzwingen vor Elementen, deren Namen diesem regulären Ausdruck " "entsprechen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -324,16 +383,16 @@ msgstr "" "class=\"chapter\" anzupassen, verwenden Sie \"h\\d,class,chapter\". " "Voreinstellung ist %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." -msgstr "Ermittelte Kapitel zum Inhaltsverzeichnis hinzufügen." +msgstr "Die ermittelten Kapitel zum Inhaltsverzeichnis hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" "Baen HTML Dateien vorbearbeiten, um die erstellte LRF Datei zu verbessern." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." @@ -341,11 +400,11 @@ msgstr "" "Sie müssen diese Auswahl treffen, wenn sie Dateien, die von pdftohtml " "erstellt wurden, verarbeiten wollen, sonst schlägt die Konvertierung fehl." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "Benutzen Sie diese Einstellung bei HTML Dateien von Book Designer." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -359,27 +418,27 @@ msgstr "" "angegeben: --serif-family \"Times New Roman\"\n" " " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "Serife Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "Serifenlose Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "Nichtproportionale Schriftartfamilie einbetten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "Mehr Wörter bei der weiteren Verarbeitung angeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "Zu LRS konvertieren" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." @@ -388,7 +447,7 @@ msgstr "" "Benutzen Sie diese Einstellung, wenn sie an einem Rechner mit geringem " "Hauptspeicher arbeiten." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -446,7 +505,7 @@ msgstr "" "%prog [options] dateiname.fb2\n" "\n" "\n" -"%prog ckonvertiert dateiname.fb2 in dateiname.lrf" +"%prog konvertiert dateiname.fb2 in dateiname.lrf" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 @@ -465,56 +524,56 @@ msgstr "Einstellungen für html2lrf" msgid "Fetching of recipe failed: " msgstr "Abruf des Rezepts misslungen: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer Datei erkannt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tAnalysiere HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen Datei erkannt. Analysiere erneut..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "Vorverarbeitetes HTML gespeichert unter " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Verarbeite %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tKonvertiere in BBeB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Konnte Datei nicht analysieren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s ist eine leere Datei" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Fehlschlag bei der Analysierung von %s %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Konnte Link %s nicht zu TOC hinzufügen" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Konnte Bild %s nicht verarbeiten. Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Konnte verschachteltes PNG %s nicht verarbeiten" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -522,14 +581,14 @@ msgstr "" "Konnte Bild nicht verarbeiten: %s\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Ein Fehler trat während der Bearbeitung einer Tabelle auf: %s. " "Tabellenformat wird ignoriert." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -537,11 +596,11 @@ msgstr "" "Schlechte Tabelle:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "Tabelle enthält Zelle, die zu groß ist" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -549,19 +608,19 @@ msgstr "" "Sichern Sie die Website %s zuerst als HTML Datei und benutzen Sie dann " "html2lrf mit der gespeicherten HTML Datei." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Konnte Umschlagbild nicht lesen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Lesen nicht möglich von: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Verarbeitung der OPF Datei schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -898,19 +957,19 @@ msgstr "Benutzung: pdf-meta dateiname.pdf" msgid "No filename specified." msgstr "Kein Dateiname angegeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [options] dateiname.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Ausgabeverzeichnis. Voreinstellung ist akutelles Verzeichnis." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "Original MOBI HTML gespeichert in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "OEB eBook erstellt in" @@ -918,18 +977,18 @@ msgstr "OEB eBook erstellt in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Bemerkung" @@ -956,33 +1015,33 @@ msgstr "Einfach" msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.<br>Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." -msgstr "Verdichte Datenbank. Das kann dauern..." +msgstr "Komprimiere Datenbank. Das kann etwas dauern..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." -msgstr "Verdichte Datenbank..." +msgstr "Komprimiere Datenbank..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Konfiguration" @@ -997,21 +1056,21 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1075,7 +1134,7 @@ msgstr "Klein" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 msgid "&Button size in toolbar" -msgstr "&Button Größe in der Symbolleiste" +msgstr "&Größe der Schaltflächen in der Symbolleiste" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 msgid "Show &text in toolbar buttons" @@ -1087,7 +1146,7 @@ msgstr "Freier unbenutzter Festplattenspeicher der Datenbank" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 msgid "&Compact database" -msgstr "Datenbank verdi&chten" +msgstr "Datenbank &komprimieren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 msgid "&Metadata from file name" @@ -1098,9 +1157,9 @@ msgid "ERROR" msgstr "FEHLER" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Autor(en)" @@ -1112,21 +1171,25 @@ msgstr "Sortierung nach Autor" msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "Verbindung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" "Sie müssen einen gültigen Zugangsschlüssel (access key) für isbndb.com " "angeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "Fehler beim Abrufen der Meta-Daten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "Keine Meta-Daten gefunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -1151,8 +1214,8 @@ msgstr "" "erhalten." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" -msgstr "&Zugriffsschlüssel:" +msgid "&Access Key:" +msgstr "Zug&angsschlüssel:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 msgid "Fetch" @@ -1169,7 +1232,7 @@ msgstr "" "Wählen Sie aus der unten stehenden Liste das Buch, das Ihrer Ausgabe " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "Details des Auftrags" @@ -1177,6 +1240,10 @@ msgstr "Details des Auftrags" msgid "Unavailable" msgstr "Nicht verfügbar" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr " - Aufträge" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "Aktive Aufträge" @@ -1185,74 +1252,74 @@ msgstr "Aktive Aufträge" msgid "&Stop selected job" msgstr "Ausgewählten Auftrag &stoppen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Meta-Daten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Look & Feel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Seiteneinrichtung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Ermittlung der Kapitel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Keine verfügbaren Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Kann %s nicht konvertieren, da dieses Buch nicht den bekannten Formaten " "entspricht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Wählen Sie das Format, das zu LRF konvertiert werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Konvertiere %s in LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Voreinstellungen zur Konvertierung wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Lesen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Sie haben nicht die nötigen Rechte, um diese Datei zu lesen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Es trat ein Fehler beim Lesen dieser Datei auf: <br /><b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " ist kein gültiges Bild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1260,11 +1327,11 @@ msgstr "" "Datei vorbearbeiten bevor sie zu LRF konvertiert wird. Das ist hilfreich, " "wenn Sie wissen, dass die Datei von einer der folgenden Bezugsquellen stammt:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Bücher von BAEN Publishers</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" @@ -1272,11 +1339,11 @@ msgstr "" "<li><b>pdftohtml</b> - HTML Dateien, die mit dem Programm pdftohtml erstellt " "wurden</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - HTML Dateien von Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1285,7 +1352,7 @@ msgstr "" "Daten werden sowohl in der Datenbank als auch in der erstellten LRF Datei " "aktualisiert." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1293,7 +1360,7 @@ msgstr "" "Aussehen der erstellten LRF Datei durch die Angabe von Schriftgrößen und " "Wortabständen angleichen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." @@ -1301,69 +1368,69 @@ msgstr "" "Seiteneinstellungen wie Ränder und die Bildschirmgröße des Zielgeräts " "angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "Feineinstellung der Erkennung von Kapitel- und Absatzüberschriften." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Keine Hilfe verfügbar</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "eBooks auf einmal zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Zu LRF konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Kategorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Auswahlmöglichkeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Um&schlagbild der Quelldatei verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " -msgstr "&Autor: " +msgstr "&Autor(en): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1371,30 +1438,30 @@ msgstr "" "Autor dieses Buches ändern. Mehrere Autoren sollten durch Kommata getrennt " "werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "So&rtierung nach Autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Herausgeber: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Herausgeber dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "&Etiketten: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1403,183 +1470,195 @@ msgstr "" "Büchern. <br><br>Sie können für Etiketten durch Kommata getrennte Wörter " "oder Sätze verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "&Serien:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Serien. Sie können neue Serien hinzufügen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Index der Serien." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Buch " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Ausgangsschrift&größe:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " Punkt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Eingebundene Schriften" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "&Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "En&codierung der Quelldatei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "E&inrücken mindestens:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "&Wortabstand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "Automatische &Rotation von Bildern einschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "&Leerzeilen zwischen Paragraphen einfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "&Tabellen ignorieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Farben nicht bea&chten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Vorbearbeiten:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "Kopfzeile" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "Kopfzeile an&zeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "&Kopfzeilenformat:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "CSS<br>überschreiben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "&Profil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Rand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " Pixel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "&Rechter Rand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "&Oberer Rand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "&Unterer Rand:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "&Konvertiere Tabellen in Bilder (gut bei großen/komlexen Tabellen)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "&Faktor der Textgröße in gerenderten Tabellen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "Auf Titel basierende Ermittlung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "Kapitel Ermittlung &deaktivieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "&Regulärer Ausdruck:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "&Kapitel zum Inhaltsverzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "Keine &Links zum Inhaltsverzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "Auf Etiketten basierende Ermittlung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "&Seitenumbruch vor Element:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "Seitenumbruch vor Element &erzwingen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "Seitenumbruch vor &Attribut erzwingen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "Erkenne K&apitel bei Element:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "Hilfe für das jeweilige Objekt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1589,8 +1668,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1600,17 +1679,17 @@ msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta-Informationen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1619,19 +1698,19 @@ msgstr "" "Dickens\" zum Beispiel als \"Dickens, Charles\"." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Bewertung:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " Sterne" @@ -1674,50 +1753,50 @@ msgstr "Kann kein Umschlagbild abrufen" msgid "You must specify the ISBN identifier for this book." msgstr "Sie müssen die ISBN für dieses Buch angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Serien entfernen (Serien ohne Bücher)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "Meta-Daten vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Umschlagbild vom Server abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Benutzername und/oder Passwort Ihres Kontos bei LibraryThing.com ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Passwort ändern" @@ -1746,13 +1825,13 @@ msgid "Tag" msgstr "Etikett" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Format" @@ -1787,39 +1866,39 @@ msgstr "" msgid "Negate" msgstr "Ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Übereinstimmung mit a&llen der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Übereinstimmung mit irge&ndeinem der folgenden Kriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Suchkriterien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Mehr" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Weniger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Etiketten Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "&Verfügbare Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1827,23 +1906,23 @@ msgstr "" "Etikett aus der Datenbank löschen. Entfernt das Etikett von allen Büchern " "und löscht es dann aus der Datenbank." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Etikett dem aktuellen Buch zuweisen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Zuge&wiesene Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Etikett vom aktuellen Buch entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Etikett &anfügen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1851,7 +1930,7 @@ msgstr "" "Ist das gewünschte Etikett nicht in der Liste, kann es hier hinzugefügt " "werden. Akzeptiert eine durch Kommata getrennte Liste von Etiketten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Etikett zu den verfügbaren Etiketten hinzufügen und dem aktuellen Buch " @@ -1870,96 +1949,96 @@ msgid "Recipe for " msgstr "Rezept für " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "In erweiterten Modus umschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Zum Basis Modus wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "Feed benötigt einen Titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Feed benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "Feed %s benötigt eine URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Gibts hier schon" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Dieser Feed wurde schon zu diesem Rezept hinzugefügt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Ungültige Eingabe" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Ungültige Eingabe" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Konnte Rezept nicht erstellen. Fehler:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Rezept ersetzen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" "Es gibt schon ein erstelltes Rezept mit dem Namen %s. Soll es ersetzt werden?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Eine Rezept Datei auswählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Eigene Nachrichtenquelle hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Verfügbare Benutzer-Rezepte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" -msgstr "&Rezept hinzufügen/aktualisieren" +msgstr "Rezept &hinzufügen/aktualisieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "Rezept entfe&rnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "Rezept ver&teilen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "Rezept aus Datei &laden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1984,56 +2063,56 @@ msgstr "" "Konfiguration bedarf. Dazu müssen Sie den \"Erweiterten Modus\" " "verwenden.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "&Titel des Rezepts:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "Ä<ester Artikel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "Ältester Artikel, der geladen wird" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " Tage" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Maximale Anzahl der Artikel pro feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Maximale Anzahl der zu ladenden Artikel pro feed." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds des Rezepts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Feed aus dem Rezept entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Feed zum Rezept hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Feed Titel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Feed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "Feed &anfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2042,7 +2121,7 @@ msgstr "" "besuchen Sie die englischsprachige Seite <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Source Code (Python) des Rezepts" @@ -2127,45 +2206,45 @@ msgstr "Regulärer Ausdruck Gruppenname (?P<series_index>)" msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Auftrag" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Status" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Fortschritt" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Laufzeit" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Fehler" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Fertig" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "Abwarten und Tee trinken..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Bei der Arbeit..." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" -msgstr "Kann Auftrag nicht abbrechen." +msgstr "Kann Auftrag nicht abbrechen" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2173,62 +2252,62 @@ msgstr "" "Kann Aufträge nicht abbrechen, die mit dem Gerät kommunizieren, da dies zu " "Datenverlust führen kann." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Kann schon fertiggestellte Aufträge nicht abbrechen." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Kann Aufträge in Warteliste nicht abbrechen." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Keine" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Buch <font face=\"serif\">%s</font> von %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Doppelklick ermöglicht <b>Bearbeitung</b><br><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Größe (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Datum" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Bewertung" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Pfad" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Zeitstempel" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Suche (Zur erweiterten Suche die Schaltfläche links klicken)" @@ -2248,15 +2327,15 @@ msgstr "Mit Trennstrich versehen" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Änderungen treten erst nach einem Neustart in Kraft." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - LRF Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Keine Treffer</b> für die Suchworte <i>%s</i> gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Keine Treffer gefunden" @@ -2300,11 +2379,11 @@ msgstr "eBook öffnen" msgid "Configure" msgstr "Konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2312,31 +2391,31 @@ msgstr "" "<p>Hilfe gibt es online bei <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "<b>%s</b>: %s von <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "An Speicherkarte senden" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Meta-Daten einzeln bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Meta-Daten auf einmal bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2344,7 +2423,7 @@ msgstr "" "Bücher rekursiv hinzufügen (Ein Buch pro Verzeichnis, setzt voraus, dass " "jede eBook Datei das gleiche Buch in einem unterschiedlichen Format enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2352,49 +2431,49 @@ msgstr "" "Bücher rekursiv hinzufügen (Mehrere Bücher pro Verzeichnis, setzt voraus, " "dass jede eBook Datei ein anderes Buch enthält)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Auf HD sichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Vorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Spezielles Format ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Einzeln konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Auf einmal konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "Angeschlossen: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Gerätedatenbank ist beschädigt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2425,8 +2504,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2434,53 +2513,53 @@ msgstr "" "<p>Es existieren bereits Bücher mit dem selben Titel in der Datenbank. " "Sollen die folgenden Bücher trotzdem hinzugefügt werden?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" -msgstr "Duplikate gefunden" +msgstr "Duplikate gefunden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Lade Bücher auf das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>Es können keine Bücher mehr auf das Gerät geladen werden, da der " "Gerätespeicher voll ist " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Lösche Bücher vom Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Kann Metadaten nicht bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Keine Bücher ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2488,68 +2567,68 @@ msgstr "" "Die folgenden Bücher konnten nicht auf das Gerät geladen werden, da keine " "geeigneten Formate vorhanden sind:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Speichern auf Festplatte nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Nachrichten abrufen von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Rufe Nachrichten ab von " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Nachrichten abgerufen. Übertragung ans Gerät läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Konvertierung nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Starte Massenkonvertierung von %d Büchern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Ansehen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Format zur Vorschau wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s hat keine verfügbaren Formate." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Konfiguration nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Konfiguration nicht möglich während Aufträge abgearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "Kopiere Datenbank nach " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "Ungültige Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2557,23 +2636,23 @@ msgstr "" "<p>Es existiert bereits eine ungültige Datenbank in %s, bitte löschen Sie " "diese, bevor sie die bestehende Datenbank verschieben.<br>Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Konnte Datenbank nicht verschieben" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Es ist keine weitere Information verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "Es ist keine weitere Information über Bücher auf dem Gerät verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2581,15 +2660,15 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "Datenbank existiert nicht" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2597,7 +2676,7 @@ msgstr "" "Das Verzeichnis, in dem die Datenbank sein sollte: %s existiert nicht mehr. " "Bitte wählen Sie einen neuen Ort für die Datenbank aus." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2605,7 +2684,7 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Letzte Version: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " @@ -2613,102 +2692,115 @@ msgid "" msgstr "" "%s wurde auf Version %s aktualisiert. Sehen Sie sich die <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">neuen Features</a> an. " -"Download Seite besuchen?" +"Möchten Sie die Download Seite besuchen?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "Neue Version verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Suche:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" "Liste der Bücher nach Titel oder Autor durchsuchen<br><br>Durch Leerzeichen " -"getrennte Wörter werden mit \"AND\" verknüpft" +"getrennte Wörter werden mit \"UND\" verknüpft" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" "Liste der Bücher nach Titel, Autor, Herausgeber, Etiketten und Bemerkungen " -"durchsuchen<br><br>Durch Leerzeichen getrennte Wörter werden mit \"AND\" " +"durchsuchen<br><br>Durch Leerzeichen getrennte Wörter werden mit \"UND\" " "verknüpft" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Quick Search löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Bücher hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Bücher entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Meta-Informationen editieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "An Reader übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Nachrichten abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "In eBooks umwandeln" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "V" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" +"Output der Konsole auf ein Dialog-Fenster umleiten (sowohl stdout als auch " +"stderr). Hilfreich bei Fenstern in denen GUI Programme nicht über Output-" +"Streams verfügen." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "FEHLER: Unbehandelte Ausnahme" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "Neue individuelle Nachrichtenquelle hinzufügen" @@ -2758,11 +2850,11 @@ msgstr "Ungültiger regulärer Ausdruck" msgid "Invalid regular expression: %s" msgstr "Ungültiger regulärer Ausdruck: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2770,7 +2862,7 @@ msgstr "" "Reader\n" "%s verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2778,22 +2870,22 @@ msgstr "" "Karte\n" "%s verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Ein Klick zeigt die Liste der auf dem Computer vorhandenen Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Ein Klick zeigt die Liste der im Hauptspeicher des Geräts vorhandenen Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" "Ein Klick zeigt die Liste der auf der Speicherkarte des Geräts vorhandenen " "Bücher" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2801,7 +2893,7 @@ msgstr "" "Pfad zur Datenbank von calibre. Die Voreinstellung ist der in den " "Einstellungen gespeicherte Pfad." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2811,7 +2903,7 @@ msgstr "" "\n" "Listet die in der Datenbank von calibre verfügbaren Bücher auf. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2824,7 +2916,7 @@ msgstr "" "Verfügbare Felder: %s\n" "Voreinstellung: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2834,11 +2926,11 @@ msgstr "" "Verfügbare Felder: %s\n" "Voreinstellung: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Sortiere Ergebnisse in aufsteigender Reihenfolge" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2848,15 +2940,15 @@ msgstr "" "sehen Sie sich bitte die Dokumentation, die die Suche betrifft, im " "Benutzerhandbuch an. Voreinstellung ist, keine Filterung durchzuführen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Ungültige Felder. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Ungültiges Sortierungs-Feld. Verfügbare Felder:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2864,7 +2956,7 @@ msgstr "" "Die folgenden Bücher wurden nicht hinzugefügt, da sie schon in der Datenbank " "vorhanden sind (siehe --duplicates Option):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2878,7 +2970,7 @@ msgstr "" "Verzeichnisse angeben, sehen Sie sich dazu die zu den Verzeichnissen " "gehörigen Optionen weiter unten an. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2887,11 +2979,11 @@ msgstr "" "und alle Dateien in diesem Verzeichnis sind verschiedene eBook Formate " "dieses einzelnen Buches" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Verzeichnisse rekursiv verarbeiten" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2899,12 +2991,12 @@ msgstr "" "Füge Bücher zur Datenbank hinzu, auch wenn diese schon vorhanden sind. Der " "Abgleich erfolgt aufgrund des Titels der Bücher." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" "Sie müssen wenigstens eine Datei auswählen, die hinzugefügt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2919,11 +3011,11 @@ msgstr "" "(Sie erhalten die ID Zahlen durch die Benutzung des Befehls list). Zum " "Beispiel: 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Sie müssen wenigstens ein Buch auswählen, das entfernt werden soll" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2937,15 +3029,15 @@ msgstr "" "gekennzeichneten logischen Buches hinzu. Sie erhalten die ID durch den list " "Befehl. Falls das Format schon vorhanden ist, wird es ersetzt.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "Sie müssen eine ID und eine eBook Datei angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "eBook Datei muss eine Endung haben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2962,11 +3054,101 @@ msgstr "" "eine Dateiendung wie LRF oder TXT oder EPUB sein. Falls das logische Buch im " "entsprechenden Format nicht vorliegt, passiert gar nichts.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Sie müssen eine ID und ein Format (Dateiendung) angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Zeige die in der calibre Datenbank gespeicherten Meta-Daten für das durch " +"die ID erkannte Buch. \n" +"\"id\" ist eine ID Nummer des Befehls \"list\". \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Drucke Meta-Daten als OPF (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "Sie müssen eine ID angeben" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" +"\n" +"%prog set_metadata [options] id /verzeichnis/zu/metadata.opf\n" +"\n" +"Übernehme die Meta-Daten, die in der calibre Datenbank für das durch die ID " +"erkannte Buch gespeichert werden,\n" +"aus der OPF Datei metadata.opf. \"id\" ist eine ID Nummer des Befehls " +"\"list\". Sie erhalten \n" +"einen Eindruck über das OPF Format, wenn Sie die --as-opf Option mit dem \n" +"Befehl show_metadata verwenden.\n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "Geben Sie eine ID und eine Meta-Daten Datei an" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" +"%prog export [options] ids \n" +"\n" +"Exportiert die durch IDs angegebenen Bücher (als durch Kommata getrennte " +"Liste) in das Dateisystem.\n" +"Der Export speichert alle Formate des Buches, sein Umschlagbild und die Meta-" +"Daten (in \n" +"einer OPF Datei). Sie erhalten ID Nummern mit dem Befehl \"list\". \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" +"Exportiere alle Bücher der Datenbank, die Liste der IDs wird ignoriert." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "Exportiere Bücher in das angegebene Verzeichnis. Voreinstellung ist" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "Exportiere alle Bücher in ein einziges Verzeichnis" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" +"Erstelle Dateinamen mit \"Autor - Titel\" anstelle von \"Titel - Autor\"" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "Sie müssen IDs oder die %s Option angeben" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2987,11 +3169,11 @@ msgstr "" " \n" "Für Hilfe zu einem bestimmten Befehl (command): %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Auftrag durch Benutzer abgebrochen" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "Konnte Arbeitsprozess nicht starten." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "Konnte die fontconfig library nicht initialisieren" @@ -3017,7 +3199,7 @@ msgid "Unknown feed" msgstr "Feed unbekannt" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artikel ohne Titel" diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index e3ec255958..b227098c18 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" -"PO-Revision-Date: 2008-06-02 08:40+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-29 05:48+0000\n" "Last-Translator: Marc van den Dikkenberg <Unknown>\n" "Language-Team: Dutch <nl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" #~ msgid "" @@ -26,6 +26,12 @@ msgstr "" #~ "herschikt. Deze functie neemt de plaats in van de --foont-delta optie, en " #~ "vervangt deze. Om toch --font-delta te gebruiken, zet deze optie als 0." +#~ msgid "" +#~ "Prevent the automatic insertion of page breaks before detected chapters." +#~ msgstr "" +#~ "Voorkom automatische toevoeging van nieuwe pagina's voor herkende " +#~ "hoofdstukken." + #~ msgid "" #~ "Specify trutype font families for serif, sans-serif and monospace fonts. " #~ "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -41,6 +47,12 @@ msgstr "" #~ "Bijvoorbeeld: --serief-famile \"%s, Times new Roman\"\n" #~ " " +#~ msgid "&Access Key;" +#~ msgstr "&Toegangssleutel" + +#~ msgid "Job killed by user" +#~ msgstr "Opdracht beëindigd door gebruiker" + #~ msgid "" #~ "Save the text below into a file named recipe.py and send the file to your " #~ "friends, to allow them to use this recipe." @@ -48,11 +60,34 @@ msgstr "" #~ "Schrijf de tekst hieronder in een bestand genaamd recipe.py en stuur deze " #~ "naar je vrieden, zodat zij dit recept ook kunnen gebruiken." -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#~ msgid "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +#~ msgstr "" +#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +#~ "type=\"text/css\">\n" +#~ "p, li { white-space: pre-wrap; }\n" +#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +#~ "font-weight:400; font-style:normal;\">\n" +#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "%sGebruik%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "Gemaakt door " @@ -60,7 +95,7 @@ msgstr "Gemaakt door " #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 msgid "Unable to detect the %s disk drive. Try rebooting." -msgstr "" +msgstr "Schijf %s is niet gevonden. Probeer te herstarten." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 msgid "Set the title. Default: filename." @@ -75,8 +110,12 @@ msgstr "" "worden. Standaard: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "Onbekend" @@ -99,7 +138,7 @@ msgstr "Zoeksleutel voor de auteur" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "Uitgeverij" @@ -205,7 +244,7 @@ msgstr "" "Geef alle inhoud weer als zwart op wit in plaats van in de kleuren die zijn " "gedefinieerd in de HTML of CSS code." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " @@ -215,23 +254,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 <a> tags are " @@ -241,7 +296,7 @@ msgstr "" "0 betekent dat de links niet zullen worden gevolgd. Een negatieve waarde " "betekent dat <a> tags worden genegeerd." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" @@ -249,18 +304,15 @@ msgstr "" "Een reguliere expressie. <a> tags waar de href mee overeen komt worden " "genegeerd. Standaard: %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "Voeg geen links toe aan de inhoudsopgave." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." -msgstr "" -"Voorkom automatische toevoeging van nieuwe pagina's voor herkende " -"hoofdstukken." - #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "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 +320,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 +352,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 +372,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 +388,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 +434,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 +509,56 @@ msgstr "Opties om het gedrag van html2lrf te beïnvloeden." msgid "Fetching of recipe failed: " msgstr "Ophalen van recept mislukt: " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "\tBook Designer bestand herkend." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "\tLezen HTML" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "\tBaen bestand herkend. Her-lezen..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "Schrijf pre-info HTML naar " -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "Verwerking %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "\tConveteer naar BBEB..." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "Kan bestand niet parseren: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "%s is een leeg bestand" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "Link %s %s kan niet worden geparseerd" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "Link %s kan niet worden toegevoegd aan de inhoudsopgave" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "Niet mogelijk om afbeelding %s te verwerken. Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "Niet mogelijk om interlaced PNG bestand %s te verwerken." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" @@ -496,14 +566,14 @@ msgstr "" "Niet mogelijk om afbeelding %s te verwerken\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" "Een fout is opgetreden tijdens het verwerken van een tabel: %s. Tabel opmaak " "zal worden genegeerd." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" @@ -511,11 +581,11 @@ msgstr "" "Foutieve tabel:\n" "%s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "Tabel heeft een cel die te groot is." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." @@ -523,19 +593,19 @@ msgstr "" "De website %s moet eerst als een HTML bestand worden weggeschreven, waarna " "je deze met html2rlf kunt converteren." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "Omslag afbeelding kan niet worden ingelezen: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "Kan niet lezen van: %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "Verwerking van OPF bestand is niet gelukt." -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -870,19 +940,19 @@ msgstr "Gebruik: pdf-meta bestand.pdf" msgid "No filename specified." msgstr "Geen bestandsnaam opgegeven" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "%prog [opties] mijnboek.mobi" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "Output folder. Standaard is dit de huidige folder." -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "RAW MOBI HTML bewaard in" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "OEB boek bemaakt in" @@ -890,18 +960,18 @@ msgstr "OEB boek bemaakt in" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "Opmerkingen" @@ -928,33 +998,33 @@ msgstr "Eenvoudig" msgid "Advanced" msgstr "Geavanceerd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "<br>Moet een folder zijn." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "Foutieve database locatie " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "Foutieve database locatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "Foutieve database locatie.<br>Kan niet schrijven naar " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "Database aan het comprimeren. Dit kan even duren." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "Comprimeren..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "Configuratie" @@ -969,21 +1039,21 @@ msgstr "Blader naar de nieuwe database locatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "..." @@ -1068,9 +1138,9 @@ msgid "ERROR" msgstr "FOUT" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "Auteur(s)" @@ -1082,19 +1152,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 +1192,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 +1210,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 +1218,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 +1230,73 @@ msgstr "Actieve opdrachten" msgid "&Stop selected job" msgstr "%Stop de geselecteerde opdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "Uiterlijk & gedrag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "Pagina Instellingen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "Hoofdstuk Detectie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "Geen beschikbare formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" "Kan %s niet converteren aangezien dit boek geen ondersteunde formaten bevat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "Kies het formaat om naar LRF te converteren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "Converteer %s naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "Zet conversie standaarden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "Kan niet lezen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "Je hebt geen permissie om het bestand te lezen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "Fout bij het lezen van bestand" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "<p>Er is een fout opgetreden bij het lezen van bestand: <br></b>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr " is geen geldige afbeelding" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" @@ -1227,11 +1305,11 @@ msgstr "" "je weet dat het bestand van een specifieke bron afkomstig is. Bekende " "bronnen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "<ol><li><b>baen</b> - Boeken van BAEN Uitgeverijen</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" @@ -1239,11 +1317,11 @@ msgstr "" "<li><b>pdftohtml</b> - HTML bestanden die zijn gegenereerd door " "pdftohtml</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "<li><b>book-designer</b> - HTML0 bestanden van Book Designer</li>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." @@ -1251,7 +1329,7 @@ msgstr "" "Geef metadata zoals de titel en auteur van het boek. <p>Metadata zal worden " "geupload in de database, evenals in het gegenereerde LRF bestand." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." @@ -1259,7 +1337,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 +1345,69 @@ msgstr "" "Specificeer de pagina indeling zoals kantlijnen en de scherm grootte van het " "doel aparaat." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "stel de detectie van hoofdstuk en sectie koppen in" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "<font color=\"gray\">Help is niet beschikbaar</font>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "Converteer meerdere eboeken naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "Converteer naar LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "Categorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "Opties" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "Boek Omslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "Verander &Omslag Afbeelding" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "Zoek een afbeelding om als omslag voor dit boek te gebruiken." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "Gebruik omslag van &bron bestand" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "Verander de titel van dit boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "&Auteur(s) " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -1337,30 +1415,30 @@ msgstr "" "Verander de auteur(s) van dit boek. Meerdere auteurs moeten met een komma " "van elkaar worden gescheiden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "Auteur So&rteer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "&Uitgeverij " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "Verander de uitgever van dit boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "Ta&gs " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." @@ -1369,183 +1447,197 @@ msgstr "" "zoeken. <br><br>Ze kunnen woorden of zinsdelen bevatten, gescheiden door " "komma's." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "%Series:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "Lijst van bekende series. Je kunt nieuwe series toevoegen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "Series Index." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "Boek " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "Basis &Letter grootte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr " pts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "Toegevoegde Lettertypen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "%Serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "S&ans-serif:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "&Monospace:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "Bron &Codering" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "Minimum &indentie:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "&Woord spatiëring" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "Activeer auto &rotatie van afbeeldingen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "Voeg &blanco regels to tussen paragrafen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "Negeer &tabellen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "Negeer &kleuren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "&Verwerk" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "Koptekst" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "Laat koptekst &zien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "&Koptekst Formaat:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "Negeer<br>CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "&Profiel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "&Linker Kantlijn:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr " px" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "&Rechter Kantlijn:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "&Boven Marge:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "&Onder Marge:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" +"&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 "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1555,8 +1647,8 @@ msgstr "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1566,17 +1658,17 @@ msgid "Edit Meta information" msgstr "Verander Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "Meta informatie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "Auteur S&ortering: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -1585,19 +1677,19 @@ msgstr "" "Bijvoorbeeld: Charles Dickens moet worden gesorteerd als: Dickens, Charles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "&Rangschikking" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "Rangschikking van dit boek. 0-5 sterren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr " sterren" @@ -1640,51 +1732,51 @@ msgstr "Kan omslag niet downloaden" msgid "You must specify the ISBN identifier for this book." msgstr "Het ISBN nummer voor dit boek moet worden opgegeven." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "Verander Meta Informatie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "Open Tag Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "Verwijder ongebruikte series (Series die geen boeken bevatten)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "Download metadata van server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "Beschikbare Formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "Voeg een nieuw formaat voor dit boek toe aan de database" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "Verwijder de geselecteerde formaten voor dit boek van de database." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "Download omslag afbeelding van de server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" "Verander de gebruikernaam en/of wachtwoord voor je account met " "LibraryThing.com" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "Wachtwoord wijzigen" @@ -1713,13 +1805,13 @@ msgid "Tag" msgstr "Tag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "Serie" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "Formaat" @@ -1754,39 +1846,39 @@ msgstr "" msgid "Negate" msgstr "omdraaien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "Geavanceerde zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "Voldoe aan a&lle van de volgende criteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "Voldoe aan een &ieder van de volgende criteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "Zoekcriteria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "Meer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "Minder" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "Tag-bewerker" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "&Beschikbare tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -1794,23 +1886,23 @@ msgstr "" "Verwijder tag uit database. Dit verwijderd de tag van alle boeken, en daarna " "uit de database." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "Pas tag toe aan het huidige boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "Toege&paste tags" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "Verwijder tag uit het huidige boek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "Voeg tag &toe:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -1818,7 +1910,7 @@ msgstr "" "Als de tag die wilt gebruiken niet in de beschikbare lijst voorkomt, dan kun " "je hem hier toevoegen als lijst gescheiden met komma's." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" "Voeg een tag toe aan de beschikbare lijst, evenals aan het huidige boek" @@ -1833,98 +1925,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:202 msgid "Switch to Advanced mode" msgstr "Schakel over naar geavanceerde modus" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "Schakel over naar simpele modus" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "Feed heeft een titel nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "De feed heeft een titel nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "Feed heeft een URL nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "De feed %s heeft een URL nodig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "Bestaat al" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "Deze feed is al aan een recept toegevoegd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "Ongeldige invoer" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "Ongeldige invoer" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 msgid "<p>Could not create recipe. Error:<br>%s" msgstr "<p>Een recept kon niet worden aangemaakt. Foutmelding:<br>%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 msgid "Replace recipe?" msgstr "Recept vervangen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "Een persoonlijk recept genaat %s bestaat al. Wilt u deze vervangen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "Kies een recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "Recepten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "Voeg een persoonlijke nieuws bron toe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "Beschikbare gebruikers recepten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "Voeg toe/Update &recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "&Verwijder recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "&Deel recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "&Laad bestand met recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1948,56 +2040,56 @@ msgstr "" "daarna de \"geavanceerde modus\" moeten gebruiken om het download process in " "te kunnen stellen.</p></body></html>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "Recept &title:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "&Oudste artikel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "Het oudste artikel om te downloaden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr " dagen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "&Max. aantal artikelen per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "Maximum aantal artikelen te downloaden per feed:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "Feeds in recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "Verwijder van recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "Voeg feed toe aan recept" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "&Feed titel:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "Feed &URL:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "V&oeg feed toe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" @@ -2007,7 +2099,7 @@ msgstr "" "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">Gebruikers Recep" "ten</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "Recept bron code (python)" @@ -2090,47 +2182,47 @@ msgstr "Reguliere expressie groep naam (?<serie_index>)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 msgid "ISBN:" -msgstr "" +msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "Opdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "Status" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "Voortgang" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "Werktijd" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "Fout" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "Voltooid" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "Wachten" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "Bezig" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "Opdracht kan niet worden afgebroken" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." @@ -2138,62 +2230,62 @@ msgstr "" "Opdrachten die communiceren met de lezer kunnen niet worden afgebroken omdat " "dit data corruptie kan veroorzaken." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "Opdrachten die al zijn voltooid kunnen niet worden afgebroken." -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "Wachtende opdrachten kunnen niet worden afgebroken." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "Geen" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "Tags" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "Formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "Boek <font face=\"serif\">%s</font> van %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "Dubbel-klik om me te <b>wijzigen</b><br><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "Grootte (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "Datum" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "Waardering" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "Pad" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "Tijdsaanduiding" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "Zoeken (Voor geavanceerd zoeken klik op de knop links)" @@ -2213,15 +2305,15 @@ msgstr "Afbreken" msgid "<b>Changes will only take affect after a restart." msgstr "<b>Veranderingen zijn pas zichtbaar na een herstart." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr " - LRF Viewer" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Geen Resultaten</b> voor de zoekterm <i>%s</i> gevonden." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "Geen resultaten gevonden" @@ -2265,11 +2357,11 @@ msgstr "Open eboek" msgid "Configure" msgstr "Configureer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" @@ -2277,32 +2369,32 @@ msgstr "" "<p>Voor assistentie, bezoek <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" "<b>%s</b>: %s door <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "Stuur naar hoofdgeheugen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "Stuur naar opslag kaart" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "Bewerk metadata individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "Bewerk metadata in groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "Voeg boeken toe uit een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" @@ -2310,7 +2402,7 @@ msgstr "" "Voeg recursief boeken toe (Een boek per folder, neemt aan dat ieder eboek " "bestand hetzelfde boek is in een ander formaat)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" @@ -2318,49 +2410,49 @@ msgstr "" "voeg recursief boeken toe (Meerdere boeken per folder, neemt aan dat ieder " "eboek bestand een ander boek is)" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "Opslaan op schijf" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "Opslaan op schijf in een enkele folder" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "Bekijk" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "Bekijk specifiek formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "Converteer Individueel" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "Converteer Groep" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr " gedetecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "Apparaat: " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " -msgstr "" +msgstr "Verbonden " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "Apparaat Database Beschadigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2389,8 +2481,8 @@ msgstr "" " </ol>\n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" @@ -2398,53 +2490,53 @@ msgstr "" "<p>Boeken met de volgende titels bestaan al in de database. Wil je ze echt " "toevoegen?<ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "Duplicaten gevonden!" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "Boeken worden geupload naar de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "Geen schijfruimte op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" "<p>De boeken kunnen niet worden geupload naar de lezer, omdat er onvoldoende " "schijfruimte beschikbaar is " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "Boeken worden verwijderd van de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "Metedata kan niet worden gewijzigd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "Geen boeken geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "Boeken worden naar de lezer verzonden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "Geen geschikte formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" @@ -2452,68 +2544,68 @@ msgstr "" "De volgende boeken konden niet naar de lezer worden deupload, omdat geen " "geschikt formaat werd gevonden:<br><ul>%s</ul>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "Kan niet naar schijf worden opgeslagen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "Download nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "Downloading nieuws van " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "Nieuws gedownload, uploading naar lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "Kan niet converteren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "Begin groep convertering van %d boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "Geen boek geselecteerd" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "Kan niet bekijken" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "Kies het te bekijken formaat" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "%s heeft geen beschikbare formaten" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "Kan niet configureren" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "Can niet configueren terwijl bestaande opdrachten bezig zijn" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "copieer database naar " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "ongeldige database" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" @@ -2521,23 +2613,23 @@ msgstr "" "<p>Een ongeldige database bestaat op %s, verwijder deze voordat je probeert " "de bestaande database te verplaatsen.<br>Foutmelding: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "Database kon niet worden verplaatst" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "Geen details beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "Geen details zijn beschikbaar voor de boeken op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "Fout bij communicatie met lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -2545,15 +2637,15 @@ msgstr "" "Er is een tijdelijke fout opgetreden tijdens de communicatie met de lezer. " "verwijzer de lezer en plug hem opnieuw in, of herstart." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" -msgstr "" +msgstr "Converteer Fout" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "database bestaat niet" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." @@ -2561,7 +2653,7 @@ msgstr "" "De folder waarin de database zou moetten zijn: %s bestaat niet meer. Kies " "een nieuwe database locatie." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" @@ -2569,34 +2661,37 @@ msgstr "" "<span style=\"color:red; font-weight:bold\">Laatste versie: <a " "href=\"%s\">%s</a></span>" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" +"%s is geupdate naar versie %s. Zie die <a " +"href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">nieuwe functies</a> " +"Bezoek download pagina?" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" -msgstr "" +msgstr "Update beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "Geavanceerde Zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "&Zoeken:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" @@ -2604,7 +2699,7 @@ msgstr "" "Zoek de boekenlijst op titel of auteur<br><br>Meerdere woorden met spaties " "worden allen gebruikt." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" @@ -2612,62 +2707,74 @@ msgstr "" "Zoek de boekenlijst op titel, auteur, uitgeverij, tags of " "opmerkingen.<br><br>Meerdere woorden met spaties worden allen gebruikt." -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "Snelzoeken wissen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "Voeg boeken toe" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "Verwijder boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "Del" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "Wijzig meta informatie" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "Zend naar lezer" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 -msgid "S" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +msgid "S" +msgstr "S" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "Download niews" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 -msgid "F" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +msgid "F" +msgstr "F" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "Converteer E-boeken" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" -msgstr "" +msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" +msgstr "V" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." msgstr "" +"Verwijs console output naar een dialoog venster (zowel stdout als stderr). " +"Handig onder Windows waar GUI applicatie geen output stream hebben." + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "FOUT: Niet-verwerkte uitzondering" #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" @@ -2718,11 +2825,11 @@ msgstr "Ongeldige reguliere expressie" msgid "Invalid regular expression: %s" msgstr "Ongeldige reguliere expressie: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "Bibliotheek" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" @@ -2730,7 +2837,7 @@ msgstr "" "Lezer\n" "%s beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" @@ -2738,20 +2845,20 @@ msgstr "" "Kaart\n" "%s beschikbaar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "Klik om een de lijst met boeken op uw computer te zien" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" "Klik om de lijst met boeken in het hoofdgeheugen van uw lezer te zien" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "Klik om de lijst met boeken op de opslag kaart van uw lezer te zien" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." @@ -2759,7 +2866,7 @@ msgstr "" "Pad naad de Calibre database. Standaard word het pad gebruikt dat is " "opgeslagen in de instellingen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" @@ -2769,7 +2876,7 @@ msgstr "" "\n" "Laat de boeken zien die beschikbaar zijn in de Calibre database. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2781,7 +2888,7 @@ msgstr "" "Beschikbare velden: %s\n" "Standaard: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -2791,11 +2898,11 @@ msgstr "" "Beschikbare velden: %s\n" "Standaard: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "Sorteer resultaten in oplopende volgorde" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -2805,15 +2912,15 @@ msgstr "" "kijk naar de zoek-gerelateerde documentatie in de gebruikershandleiding. " "Standaard word er niet gefilterd." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "Ongeldig veld. Beschikbare velden:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "Ongeldig sorteer veld. Beschikbare velden:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -2821,7 +2928,7 @@ msgstr "" "De volgende boeken zijn niet toegevoegd omdat ze al bestaan in de database. " "(Zie de --duplicates optie):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2834,7 +2941,7 @@ msgstr "" "Voeg de gespecificeerde bestanden als boeken toe aan de database. Je kunt " "ook folders opgeven, zie de folder-gerelateerde opties hieronder. \n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -2843,11 +2950,11 @@ msgstr "" "bestanden in de folder verschillende bestandsformaten zin voor dat enkele " "boek." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "Bewerk folders recursief" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -2855,11 +2962,11 @@ msgstr "" "Voeg boeken toe aan de database zelfs als deze al bestaan. Vergelijking is " "gebaseerd op de boek titels." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "Ten minste een boek moet worden opgegeven om toe te voegen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2873,11 +2980,11 @@ msgstr "" "moeten een lijst zijn die is gescheiden door komma's. (Je kan de id nummers " "zien door het list commando te gebruiken). Bijvoorbeeld, 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "Ten minste een boek moet worden opgegeven om te verwijderen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2892,15 +2999,15 @@ msgstr "" "door het list commando te gebruiken. Als het formaat al bestaat, dan zal het " "worden vervangen.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "zowel een id als een eboek bestand moeten worden gespecificeerd" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "eboek bestand heeft een extensie nodig" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2917,11 +3024,98 @@ msgstr "" "bestands extensie zoals LRF, TXT of EPUB. Als het logische boek niet in dit " "formaat bestaat, dan zal er niets gebeuren.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "Een id en een formaat moeten worden opgegeven" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" +"\n" +"%prog show_metadata [opties] id\n" +"\n" +"Laat de metadata uit de Calibre database zien voor het boek geidentificeerd " +"met het id. \n" +"id is een id nummer van het list commando \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "Print metadata in OPF formaat (XML)" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "Je moet een id opgeven" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" +"\n" +"%prog set_metadata [opties] id /pad/naar/metadata.opf\n" +"\n" +"Definieer de metadata die is opgeslagen in de Calibre database voor het " +"boek\n" +"geidenticeerd met id uit het OPF bestand metadata.opf. id is een id nummer " +"uit\n" +"het list commando. Je kunt meer informatie voor het OPF formaat zien door\n" +"--as-opf parameter op te geven bij het show_metadata commando.\n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "Je moet een id en metadata bestand opgeven" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" +"%prog export [opties] ids \n" +"\n" +"Exporteer de boeken opgegeven als ids (een lijst gescheiden met komma's)\n" +"naar het bestandssysteem. De exporteer operatie bewaard alle formaten van\n" +"het boek, de cover en metadata (in een opf bestand) Je kunt id nummers zien\n" +"via het list commando. \n" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "Exporteer alle boeken in de database, negeer de lijst met ids." + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "Exporteer boeken naar de opgegeven folder. Standaard is" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "exporteer alle boeken naar een enkele folder" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "Maak bestands namen als auteur - titel in plaats van titel - auteur" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "Je moet ids opgeven of de %s optie gebruiken" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2939,13 +3133,13 @@ msgstr "" "commando is een van de volgende:\n" " %s\n" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" -msgstr "Opdracht beëindigd door gebruiker" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "Werker sessie kan niet worden gestart." -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" -msgstr "" +msgstr "De fontconfig bibliotheek kon niet worden geinitialiseerd." #: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 msgid "URL must have the scheme sftp" @@ -2969,7 +3163,7 @@ msgid "Unknown feed" msgstr "Onbekende feed" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "Artikel zonder naam" diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index 9701545c99..665f3ecc24 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.55\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-05-24 06:25+0000\n" "Last-Translator: Kovid Goyal <Unknown>\n" "Language-Team: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "HTML or CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " "device. Default: %s Supported profiles: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that <a> tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,25 @@ msgid "" "class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1354,36 +1397,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr "" @@ -1422,49 +1465,49 @@ msgstr "" msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1493,13 +1536,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "" @@ -1530,67 +1573,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1607,95 +1650,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1709,62 +1752,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -1843,106 +1886,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -1962,15 +2005,15 @@ msgstr "" msgid "<b>Changes will only take affect after a restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "" @@ -2014,95 +2057,95 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2118,268 +2161,278 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2424,48 +2477,48 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2473,39 +2526,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2514,27 +2567,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2543,11 +2596,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2556,15 +2609,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2574,11 +2627,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2590,11 +2709,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2620,7 +2739,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 43ea54d181..db11c7cfe7 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.17\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-06-12 20:18+0000\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" "PO-Revision-Date: 2008-05-24 06:19+0000\n" "Last-Translator: Kovid Goyal <Unknown>\n" "Language-Team: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-06-15 22:20+0000\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 msgid "%sUsage%s: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 msgid "Created by " msgstr "" @@ -42,8 +42,12 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:677 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 msgid "Unknown" msgstr "" @@ -66,7 +70,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 msgid "Publisher" msgstr "" @@ -151,58 +155,77 @@ msgid "" "HTML or CSS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 msgid "" "Profile of the target device for which this LRF is being generated. The " "profile determines things like the resolution and screen size of the target " "device. Default: %s Supported profiles: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 msgid "Left margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 msgid "Right margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:139 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 msgid "Top margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:141 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 msgid "Bottom margin of page. Default is %default px." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 msgid "" "The maximum number of levels to recursively process links. A value of 0 " "means thats links are not followed. A negative value means that <a> tags are " "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 msgid "" "A regular expression. <a> tags whose href matches will be ignored. Defaults " "to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 msgid "Don't add links to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 -msgid "" -"Prevent the automatic insertion of page breaks before detected chapters." +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 msgid "" "The regular expression used to detect chapter titles. It is searched for in " "heading tags (h1-h6). Defaults to %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 msgid "" "If html2lrf does not find any page breaks in the html file and cannot detect " "chapter headings, it will automatically insert page-breaks before the tags " @@ -213,12 +236,12 @@ msgid "" "has only a few elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 msgid "" "Force a page break before tags whose names match this regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 msgid "" "Force a page break before an element having the specified attribute. The " "format for this option is tagname regexp,attribute name,attribute value " @@ -226,25 +249,25 @@ msgid "" "class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 msgid "Add detected chapters to the table of contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 msgid "Preprocess Baen HTML files to improve generated LRF." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 msgid "" "You must add this option if processing files generated by pdftohtml, " "otherwise conversion will fail." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 msgid "Use this option on html0 files from Book Designer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 msgid "" "Specify trutype font families for serif, sans-serif and monospace fonts. " "These fonts will be embedded in the LRF file. Note that custom fonts lead to " @@ -252,33 +275,33 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 msgid "The serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 msgid "The sans-serif family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 msgid "Be verbose while processing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 msgid "Convert to LRS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 msgid "" "Minimize memory usage at the cost of longer processing times. Use this " "option if you are on a memory constrained machine." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 msgid "" "Specify the character encoding of the source file. If the output LRF file " "contains strange characters, try changing this option. A common encoding for " @@ -334,95 +357,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:531 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:523 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:543 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:587 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:929 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:967 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1687 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1689 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1711 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1741 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1781 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1784 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1913 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1919 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -693,19 +716,19 @@ msgstr "" msgid "No filename specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 msgid "Output directory. Defaults to current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:325 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 msgid "Raw MOBI HTML saved in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 msgid "OEB ebook created in" msgstr "" @@ -713,18 +736,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 msgid "Comments" msgstr "" @@ -751,33 +774,33 @@ msgstr "" msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "<br>Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 msgid "Invalid database location " msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 msgid "Invalid database location.<br>Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting database. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 msgid "Compacting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 msgid "Configuration" msgstr "" @@ -792,21 +815,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "..." msgstr "" @@ -889,9 +912,9 @@ msgid "ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 msgid "Author(s)" msgstr "" @@ -903,19 +926,23 @@ msgstr "" msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 msgid "Cannot connect" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 msgid "You must specify a valid access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -935,7 +962,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 -msgid "&Access Key;" +msgid "&Access Key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 @@ -951,7 +978,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 msgid "Details of job" msgstr "" @@ -959,6 +986,10 @@ msgstr "" msgid "Unavailable" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 msgid "Active Jobs" msgstr "" @@ -967,383 +998,395 @@ msgstr "" msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "Look & Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "Page Setup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Chapter Detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 msgid "No available formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 msgid "Cannot convert %s as this book has no supported formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 msgid "Choose the format to convert into LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 msgid "Convert %s to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 msgid "Set conversion defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 msgid "" "Preprocess the file before converting to LRF. This is useful if you know " "that the file is from a specific source. Known sources:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 msgid "" "<li><b>pdftohtml</b> - HTML files that are the output of the program " "pdftohtml</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 msgid "" "Specify metadata such as title and author for the book.<p>Metadata will be " "updated in the database as well as the generated LRF file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 msgid "" "Adjust the look of the generated LRF file by specifying things like font " "sizes and the spacing between words." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 msgid "" "Specify the page settings like margins and the screen size of the target " "device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 msgid "Fine tune the detection of chapter and section headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 msgid "<font color=\"gray\">No help available</font>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 msgid "Bulk convert ebooks to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 msgid "Convert to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 msgid "Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 msgid "Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 msgid "Change the publisher of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 msgid "" "Tags categorize the book. This is particularly useful while searching. " "<br><br>They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 msgid "Series index." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 msgid "Book " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 msgid " pts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 msgid "Embedded Fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 msgid "&Serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 msgid "S&ans-serif:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 msgid "&Monospace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 msgid "Source en&coding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 msgid "Minimum &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 msgid "&Word spacing:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 msgid "Enable auto &rotation of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 msgid "Insert &blank lines between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 msgid "Ignore &tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 msgid "Ignore &colors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 msgid "&Preprocess:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 msgid "Header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 msgid "&Show header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 msgid "&Header format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 msgid "Override<br>CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 msgid "&Left Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 msgid " px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 msgid "&Right Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 msgid "&Top Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 msgid "&Bottom Margin:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 msgid "Title based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 msgid "&Disable chapter detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 msgid "&Regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 msgid "Add &chapters to table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 msgid "Don't add &links to the table of contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 msgid "Tag based detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 msgid "&Page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 msgid "&Force page break before tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 msgid "Force page break before &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 msgid "Help on item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " -"font-weight:400; font-style:normal;\">\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" "family:'Sans Serif'; font-size:9pt;\"></p></body></html>" @@ -1354,36 +1397,36 @@ msgid "Edit Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 msgid "Rating of this book. 0-5 stars" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 msgid " stars" msgstr "" @@ -1422,49 +1465,49 @@ msgstr "" msgid "You must specify the ISBN identifier for this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 msgid "Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 msgid "Fetch cover image from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 msgid "" "Change the username and/or password for your account at LibraryThing.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 msgid "Change password" msgstr "" @@ -1493,13 +1536,13 @@ msgid "Tag" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 msgid "Series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 msgid "Format" msgstr "" @@ -1530,67 +1573,67 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 msgid "Match a&ll of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 msgid "Match a&ny of the following criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 msgid "Search criteria" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 msgid "More" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 msgid "Fewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -1607,95 +1650,95 @@ msgid "Recipe for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 msgid "" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style " "type=\"text/css\">\n" @@ -1709,62 +1752,62 @@ msgid "" "process.</p></body></html>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 msgid "Recipe &title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 msgid "&Oldest article:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 msgid "The oldest article to download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 msgid "&Max. number of articles per feed:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 msgid "Maximum number of articles to download per feed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 msgid "Feeds in recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 msgid "Remove feed from recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 msgid "Add feed to recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 msgid "&Feed title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 msgid "Feed &URL:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 msgid "&Add feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 msgid "" "For help with writing advanced news recipes, please visit <a " "href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 msgid "Recipe source code (python)" msgstr "" @@ -1843,106 +1886,106 @@ msgstr "" msgid "ISBN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 msgid "Status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 msgid "Progress" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 msgid "Finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Waiting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 msgid "" "Cannot kill jobs that are communicating with the device as this may cause " "data corruption." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 msgid "Cannot kill already completed jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 msgid "Cannot kill waiting jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 msgid "Date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -1962,15 +2005,15 @@ msgstr "" msgid "<b>Changes will only take affect after a restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 msgid " - LRF Viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 msgid "No matches found" msgstr "" @@ -2014,95 +2057,95 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 msgid "" "<p>For help visit <a " "href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 msgid "Send to storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 msgid "" "Add books recursively (One book per directory, assumes every ebook file is " "the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 msgid "" "Add books recursively (Multiple books per directory, assumes every ebook " "file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 msgid "" "\n" " <p>The database of books on the reader is corrupted. Try the " @@ -2118,268 +2161,278 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 msgid "" "<p>Books with the same title as the following already exist in the database. " "Add them anyway?<ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:429 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found:<br><ul>%s</ul>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 msgid "News fetched. Uploading to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:736 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 msgid "Starting Bulk conversion of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:867 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 msgid "Copying database to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 msgid "" "<p>An invalid database already exists at %s, delete it before trying to move " "the existing database.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 msgid "Could not move database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "Database does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1098 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 msgid "" "The directory in which the database should be: %s no longer exists. Please " "choose a new database location." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 msgid "" "<span style=\"color:red; font-weight:bold\">Latest version: <a " "href=\"%s\">%s</a></span>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "" "%s has been updated to version %s. See the <a " "href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " "Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "" "Search the list of books by title or author<br><br>Words separated by spaces " "are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "" "Search the list of books by title, author, publisher, tags and " "comments<br><br>Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Del" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "Edit meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "Convert E-books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "V" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 msgid "Add a custom news source" msgstr "" @@ -2424,48 +2477,48 @@ msgstr "" msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 msgid "" "Reader\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 msgid "" "Card\n" "%s available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 msgid "Click to see the list of books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 msgid "Click to see the list of books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 msgid "Click to see the list of books on the storage card in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:25 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 msgid "" "Path to the calibre database. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:80 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:88 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -2473,39 +2526,39 @@ msgid "" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:101 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:108 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:170 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:195 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -2514,27 +2567,27 @@ msgid "" "the directory related options below. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:204 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:231 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 msgid "" "%prog remove ids\n" "\n" @@ -2543,11 +2596,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:243 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -2556,15 +2609,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:274 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -2574,11 +2627,77 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:300 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:310 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -2590,11 +2709,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/parallel.py:131 -msgid "Job killed by user" +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:124 +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 msgid "Could not initialize the fontconfig library" msgstr "" @@ -2620,7 +2739,7 @@ msgid "Unknown feed" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 msgid "Untitled article" msgstr "" diff --git a/src/calibre/translations/te.po b/src/calibre/translations/te.po new file mode 100644 index 0000000000..51d7928984 --- /dev/null +++ b/src/calibre/translations/te.po @@ -0,0 +1,2974 @@ +# Telugu translation for calibre +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the calibre package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: calibre\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2008-06-23 07:18+0000\n" +"PO-Revision-Date: 2008-06-24 13:22+0000\n" +"Last-Translator: వీవెన్ (Veeven) <Unknown>\n" +"Language-Team: Telugu <te@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-06-29 17:00+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:99 +msgid "%sUsage%s: %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:136 +msgid "Created by " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:112 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:146 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174 +msgid "Unable to detect the %s disk drive. Try rebooting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:73 +msgid "Set the title. Default: filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:75 +msgid "" +"Set the author(s). Multiple authors should be set as a comma separated list. " +"Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:681 +#: /home/kovid/work/calibre/src/calibre/library/database.py:925 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 +msgid "Unknown" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:78 +msgid "Set the comment." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:80 +msgid "Set the category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:82 +msgid "Sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:84 +msgid "Sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 +msgid "Publisher" +msgstr "ప్రచురణకర్త" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:88 +msgid "Path to file containing image to be used as cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:90 +msgid "" +"If there is a cover graphic detected in the source file, use that instead of " +"the specified cover." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:93 +msgid "Output file name. Default is derived from input filename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:95 +msgid "" +"Render HTML tables as blocks of text instead of actual tables. This is " +"neccessary if the HTML contains very large or complex tables." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:98 +msgid "" +"Specify the base font size in pts. All fonts are rescaled accordingly. This " +"option obsoletes the --font-delta option and takes precedence over it. To " +"use --font-delta, set this to 0. Default: %defaultpt" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:100 +msgid "Enable autorotation of images that are wider than the screen width." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:103 +msgid "Set the space between words in pts. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:105 +msgid "Separate paragraphs by blank lines." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:107 +msgid "Add a header to all the pages with title and author." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:109 +msgid "" +"Set the format of the header. %a is replaced by the author and %t by the " +"title. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:111 +msgid "" +"Override the CSS. Can be either a path to a CSS stylesheet or a string. If " +"it is a string it is interpreted as CSS." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:113 +msgid "" +"Use the <spine> element from the OPF file to determine the order in which " +"the HTML files are appended to the LRF. The .opf file must be in the same " +"directory as the base HTML file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:115 +msgid "" +"Minimum paragraph indent (the indent of the first line of a paragraph) in " +"pts. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:117 +msgid "" +"Increase the font size by 2 * FONT_DELTA pts and the line spacing by " +"FONT_DELTA pts. FONT_DELTA can be a fraction.If FONT_DELTA is negative, the " +"font size is decreased." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:122 +msgid "" +"Render all content as black on white instead of the colors specified by the " +"HTML or CSS." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 +msgid "" +"Profile of the target device for which this LRF is being generated. The " +"profile determines things like the resolution and screen size of the target " +"device. Default: %s Supported profiles: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:134 +msgid "Left margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:136 +msgid "Right margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:138 +msgid "Top margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:140 +msgid "Bottom margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:142 +msgid "" +"Render tables in the HTML as images (useful if the document has large or " +"complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Multiply the size of text in rendered tables by this factor. Default is " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:149 +msgid "" +"The maximum number of levels to recursively process links. A value of 0 " +"means thats links are not followed. A negative value means that <a> tags are " +"ignored." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:153 +msgid "" +"A regular expression. <a> tags whose href matches will be ignored. Defaults " +"to %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:157 +msgid "Don't add links to the table of contents." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:161 +msgid "Prevent the automatic detection chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +msgid "" +"The regular expression used to detect chapter titles. It is searched for in " +"heading tags (h1-h6). Defaults to %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:167 +msgid "" +"Detect a chapter beginning at an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 +msgid "" +"If html2lrf does not find any page breaks in the html file and cannot detect " +"chapter headings, it will automatically insert page-breaks before the tags " +"whose names match this regular expression. Defaults to %default. You can " +"disable it by setting the regexp to \"$\". The purpose of this option is to " +"try to ensure that there are no really long pages as this degrades the page " +"turn performance of the LRF. Thus this option is ignored if the current page " +"has only a few elements." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:179 +msgid "" +"Force a page break before tags whose names match this regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:181 +msgid "" +"Force a page break before an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute " +"class=\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:184 +msgid "Add detected chapters to the table of contents." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:187 +msgid "Preprocess Baen HTML files to improve generated LRF." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:189 +msgid "" +"You must add this option if processing files generated by pdftohtml, " +"otherwise conversion will fail." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 +msgid "Use this option on html0 files from Book Designer." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:194 +msgid "" +"Specify trutype font families for serif, sans-serif and monospace fonts. " +"These fonts will be embedded in the LRF file. Note that custom fonts lead to " +"slower page turns. For example: --serif-family \"Times New Roman\"\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:202 +msgid "The serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:205 +msgid "The sans-serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:208 +msgid "The monospace family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:212 +msgid "Be verbose while processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:214 +msgid "Convert to LRS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:216 +msgid "" +"Minimize memory usage at the cost of longer processing times. Use this " +"option if you are on a memory constrained machine." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:218 +msgid "" +"Specify the character encoding of the source file. If the output LRF file " +"contains strange characters, try changing this option. A common encoding for " +"files from windows computers is cp-1252. Another common choice is utf-8. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:143 +msgid "" +"any2lrf [options] myfile\n" +"\n" +"Convert any ebook format into LRF. Supported formats are:\n" +"LIT, RTF, TXT, HTML, EPUB, MOBI, PRC and PDF. any2lrf will also process a " +"RAR or\n" +"ZIP archive, looking for an ebook inside the archive.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:158 +msgid "No file to convert specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 +msgid "" +"Usage: %prog [options] mybook.epub\n" +" \n" +" \n" +"%prog converts mybook.epub to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:19 +msgid "" +"%prog [options] mybook.fb2\n" +"\n" +"\n" +"%prog converts mybook.fb2 to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 +msgid "Print generated HTML to stdout and quit." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 +msgid "Options to control the behavior of feeds2disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:24 +msgid "Options to control the behavior of html2lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:46 +msgid "Fetching of recipe failed: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +msgid "\tBook Designer file detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 +msgid "\tParsing HTML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:339 +msgid "\tBaen file detected. Re-parsing..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:355 +msgid "Written preprocessed HTML to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 +msgid "Processing %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 +msgid "\tConverting to BBeB..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:529 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:542 +msgid "Could not parse file: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:534 +msgid "%s is an empty file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:554 +msgid "Failed to parse link %s %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:598 +msgid "Cannot add link %s to TOC" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:942 +msgid "Unable to process image %s. Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:980 +msgid "Unable to process interlaced PNG %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 +msgid "" +"Could not process image: %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1742 +msgid "" +"An error occurred while processing a table: %s. Ignoring table markup." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1744 +msgid "" +"Bad table:\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1766 +msgid "Table has cell that is too large" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 +msgid "" +"You have to save the website %s as an html file first and then run html2lrf " +"on it." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1838 +msgid "Could not read cover image: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1841 +msgid "Cannot read from: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1975 +msgid "Failed to process opf file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1981 +msgid "" +"Usage: %prog [options] mybook.html\n" +"\n" +"\n" +"%prog converts mybook.html to mybook.lrf. \n" +"%prog follows all links in mybook.html that point \n" +"to local files recursively. Thus, you can use it to \n" +"convert a whole tree of HTML files." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:21 +msgid "" +"Usage: %prog [options] mybook.lit\n" +"\n" +"\n" +"%prog converts mybook.lit to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:132 +msgid "" +"%prog book.lrf\n" +"Convert an LRF file into an LRS (XML UTF-8 encoded) file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:133 +msgid "Output LRS file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:151 +msgid "Parsing LRF..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:154 +msgid "Creating XML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:156 +msgid "LRS written to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:243 +msgid "Could not read from thumbnail file:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:263 +msgid "" +"%prog [options] file.lrs\n" +"Compile an LRS file into an LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:264 +msgid "Path to output file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +msgid "Verbose processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 +msgid "Convert LRS to LRS, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:454 +msgid "Invalid LRF file. Could not set metadata." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:579 +msgid "" +"%prog [options] mybook.lrf\n" +"\n" +"\n" +"Show/edit the metadata in an LRF file.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:586 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18 +msgid "Set the book title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:588 +msgid "Set sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:590 +msgid "Set the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:592 +msgid "Set sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:594 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22 +msgid "The category this book belongs to. E.g.: History" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597 +msgid "Path to a graphic that will be set as this files' thumbnail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600 +msgid "" +"Path to a txt file containing the comment to be stored in the lrf file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:604 +msgid "Extract thumbnail from LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:606 +msgid "" +"Extract cover from LRF file. Note that the LRF format has no defined cover, " +"so we use some heuristics to guess the cover." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608 +msgid "Set book ID" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610 +msgid "Don't know what this is for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/mobi/convert_from.py:43 +msgid "" +"Usage: %prog [options] mybook.mobi|prc\n" +"\n" +"\n" +"%prog converts mybook.mobi to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:42 +msgid "Could not find pdftohtml, check it is in your PATH" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:51 +msgid " does not allow copying of text." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:54 +msgid "" +" is an image based PDF. Only conversion of text based PDFs is supported." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:61 +msgid "" +"%prog [options] mybook.pdf\n" +"\n" +"\n" +"%prog converts mybook.pdf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:402 +msgid "" +"Path to output directory in which to create the HTML file. Defaults to " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 +msgid "Be more verbose." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 +msgid "You must specify a single PDF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/rtf/convert_from.py:20 +msgid "" +"%prog [options] mybook.rtf\n" +"\n" +"\n" +"%prog converts mybook.rtf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:17 +msgid "" +"%prog [options] mybook.txt\n" +"\n" +"\n" +"%prog converts mybook.txt to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20 +msgid "Set the authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24 +msgid "Set the comment" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +msgid "mybook.epub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:34 +msgid "Usage:" +msgstr "వాడుక:" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 +msgid "" +"\n" +"%prog [options] key\n" +"\n" +"Fetch metadata for books from isndb.com. You can specify either the \n" +"books ISBN ID or its title and author. If you specify the title and author,\n" +"then more than one book may be returned.\n" +"\n" +"key is the account key you generate after signing up for a free account from " +"isbndb.com.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 +msgid "The ISBN ID of the book you want metadata for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 +msgid "The author whose book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 +msgid "The title of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 +msgid "The publisher of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:46 +msgid "" +"Could not fetch cover as server is experiencing high load. Please try again " +"later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:47 +msgid " not found." +msgstr " దొరకలేదు." + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:50 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:81 +msgid "LibraryThing.com server error. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:59 +msgid "" +"\n" +"%prog [options] ISBN\n" +"\n" +"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747 +msgid "Usage: %s file.lit" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754 +msgid "Cover saved to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:36 +msgid "Usage: pdf-meta file.pdf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:37 +msgid "No filename specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:310 +msgid "%prog [options] myebook.mobi" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:312 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:331 +msgid "Raw MOBI HTML saved in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:333 +msgid "OEB ebook created in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:751 +msgid "Title" +msgstr "శీర్షిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:242 +msgid "Comments" +msgstr "వ్యాఖ్యలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +msgid "Dialog" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +msgid "TextLabel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +msgid "Choose Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:22 +msgid "Basic" +msgstr "ప్రాధమిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:23 +msgid "Advanced" +msgstr "ఉన్నత" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +msgid "<br>Must be a directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +msgid "Invalid database location " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +msgid "Invalid database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:97 +msgid "Invalid database location.<br>Cannot write to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 +msgid "Compacting database. This may take a while." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:109 +msgid "Compacting..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +msgid "Configuration" +msgstr "స్వరూపణం" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:199 +msgid "&Location of books database (library1.db)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:200 +msgid "Browse for the new database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 +msgid "..." +msgstr "..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:202 +msgid "Use &Roman numerals for series number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:203 +msgid "Default network &timeout:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:204 +msgid "" +"Set the default timeout for network fetches (i.e. anytime we go out to the " +"internet to get information)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:205 +msgid " seconds" +msgstr " క్షణాలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:206 +msgid "&Priority for conversion jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:207 +msgid "Frequently used directories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:208 +msgid "Add a directory to the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:210 +msgid "Remove a directory from the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:212 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:213 +msgid "Toolbar" +msgstr "పనిముట్ల పట్టీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:214 +msgid "Large" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:215 +msgid "Medium" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:216 +msgid "Small" +msgstr "చిన్న" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:217 +msgid "&Button size in toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:218 +msgid "Show &text in toolbar buttons" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:219 +msgid "Free unused diskspace from the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:220 +msgid "&Compact database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:221 +msgid "&Metadata from file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:41 +msgid "ERROR" +msgstr "పొరపాటు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:752 +msgid "Author(s)" +msgstr "రచయిత(లు)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:38 +msgid "Author Sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:40 +msgid "ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104 +msgid "Cannot connect" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105 +msgid "You must specify a valid access key for isbndb.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139 +msgid "Error fetching metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 +msgid "No metadata found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144 +msgid "" +"No metadata found, try adjusting the title and author or the ISBN key." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:77 +msgid "Fetch metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:78 +msgid "Fetching metadata for <b>%1</b>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:79 +msgid "" +"Sign up for a free account from <a " +"href=\"http://www.isbndb.com\">ISBNdb.com</a> to get an access key." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 +msgid "&Access Key:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 +msgid "Fetch" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:82 +msgid "Matches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:83 +msgid "" +"Select the book that most closely matches your copy from the list below" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:31 +msgid "Details of job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:27 +msgid "Unavailable" +msgstr "అందుబాటులో లేదు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38 +msgid " - Jobs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38 +msgid "Active Jobs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:39 +msgid "&Stop selected job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +msgid "Metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +msgid "Look & Feel" +msgstr "రూపు రేఖలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 +msgid "Page Setup" +msgstr "పేజీ అమరిక" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 +msgid "Chapter Detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:92 +msgid "No available formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:93 +msgid "Cannot convert %s as this book has no supported formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 +msgid "Choose the format to convert into LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:105 +msgid "Convert %s to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:160 +msgid "Set conversion defaults" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 +msgid "Cannot read" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 +msgid "You do not have permission to read the file: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 +msgid "Error reading file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 +msgid "<p>There was an error reading from file: <br /><b>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:189 +msgid " is not a valid picture" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:255 +msgid "" +"Preprocess the file before converting to LRF. This is useful if you know " +"that the file is from a specific source. Known sources:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:256 +msgid "<ol><li><b>baen</b> - Books from BAEN Publishers</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:257 +msgid "" +"<li><b>pdftohtml</b> - HTML files that are the output of the program " +"pdftohtml</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258 +msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:291 +msgid "" +"Specify metadata such as title and author for the book.<p>Metadata will be " +"updated in the database as well as the generated LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +msgid "" +"Adjust the look of the generated LRF file by specifying things like font " +"sizes and the spacing between words." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:293 +msgid "" +"Specify the page settings like margins and the screen size of the target " +"device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:294 +msgid "Fine tune the detection of chapter and section headings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:303 +msgid "<font color=\"gray\">No help available</font>" +msgstr "<font color=\"gray\">సహాయమేమీ అందుబాటులో లేదు</font>" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:404 +msgid "Bulk convert ebooks to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 +msgid "Convert to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +msgid "Category" +msgstr "వర్గం" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 +msgid "Options" +msgstr "ఎంపికలు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:290 +msgid "Book Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:291 +msgid "Change &cover image:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:292 +msgid "Browse for an image to use as the cover of this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 +msgid "Use cover from &source file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +msgid "&Title: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +msgid "Change the title of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +msgid "&Author(s): " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +msgid "" +"Change the author(s) of this book. Multiple authors should be separated by a " +"comma" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +msgid "Author So&rt:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +msgid "&Publisher: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +msgid "Change the publisher of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +msgid "Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +msgid "" +"Tags categorize the book. This is particularly useful while searching. " +"<br><br>They can be any words or phrases, separated by commas." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +msgid "&Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +msgid "List of known series. You can add new series." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:280 +msgid "Series index." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281 +msgid "Book " +msgstr "పుస్తకం " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +msgid "Base &font size:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +msgid " pts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +msgid "Embedded Fonts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 +msgid "&Serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +msgid "S&ans-serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 +msgid "&Monospace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +msgid "Source en&coding:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 +msgid "Minimum &indent:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +msgid "&Word spacing:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +msgid "Enable auto &rotation of images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +msgid "Insert &blank lines between paragraphs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +msgid "Ignore &tables" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +msgid "Ignore &colors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +msgid "&Preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:548 +msgid "Header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:549 +msgid "&Show header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:550 +msgid "&Header format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:551 +msgid "Override<br>CSS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:552 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:553 +msgid "&Left Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:560 +msgid " px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:555 +msgid "&Right Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557 +msgid "&Top Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:559 +msgid "&Bottom Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:561 +msgid "&Convert tables to images (good for large/complex tables)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:562 +msgid "&Multiplier for text size in rendered tables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:563 +msgid "Title based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:564 +msgid "&Disable chapter detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:565 +msgid "&Regular expression:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:566 +msgid "Add &chapters to table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:567 +msgid "Don't add &links to the table of contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:568 +msgid "Tag based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:569 +msgid "&Page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:570 +msgid "&Force page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:571 +msgid "Force page break before &attribute:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:572 +msgid "Detect chapter &at tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:573 +msgid "Help on item" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:574 +msgid "" +"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +"type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Candara'; font-size:11pt; font-" +"weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; " +"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-" +"family:'Sans Serif'; font-size:9pt;\"></p></body></html>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 +msgid "Edit Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +msgid "Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +msgid "Author S&ort: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +msgid "" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +msgid "&Rating:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +msgid "Rating of this book. 0-5 stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +msgid " stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 +msgid "Add Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 +msgid "&Remove tags:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 +msgid "Comma separated list of tags to remove from the books. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +msgid "" +"<p>Enter your username and password for <b>LibraryThing.com</b>. <br/>If you " +"do not have one, you can <a href='http://www.librarything.com'>register</a> " +"for free!.</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "<b>Could not fetch cover.</b><br/>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +msgid "Could not fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "Cannot fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +msgid "You must specify the ISBN identifier for this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +msgid "Edit Meta Information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +msgid "Open Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:284 +msgid "Fetch metadata from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:285 +msgid "Available Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:286 +msgid "Add a new format for this book to the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288 +msgid "Remove the selected formats for this book from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294 +msgid "Fetch cover image from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:295 +msgid "" +"Change the username and/or password for your account at LibraryThing.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:296 +msgid "Change password" +msgstr "సంకేతపదం మార్చు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:55 +msgid "Password needed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 +msgid "&Username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 +msgid "&Password:" +msgstr "&సంకేతపదం:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 +msgid "&Show password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:15 +msgid "Author" +msgstr "రచయిత" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:17 +msgid "Tag" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:407 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:685 +msgid "Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:21 +msgid "Any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 +msgid "Form" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 +msgid "contains" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 +msgid "The text to search for. It is interpreted as a regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 +msgid "" +"<p>Negate this match. That is, only return results that <b>do not</b> match " +"this query." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39 +msgid "Negate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 +msgid "Advanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 +msgid "Match a&ll of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 +msgid "Match a&ny of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 +msgid "Search criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:73 +msgid "More" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:74 +msgid "Fewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 +msgid "Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 +msgid "A&vailable tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 +msgid "" +"Delete tag from database. This will unapply the tag from all books and then " +"remove it from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 +msgid "Apply tag to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 +msgid "A&pplied tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 +msgid "Unapply (remove) tag from current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +msgid "&Add tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +msgid "" +"If the tag you want is not in the available list, you can add it here. " +"Accepts a comma separated list of tags." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 +msgid "Add tag to available tags and apply it to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:63 +msgid "No recipe selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:69 +msgid "The attached file: %s is a recipe to download %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:70 +msgid "Recipe for " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:202 +msgid "Switch to Advanced mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:100 +msgid "Switch to Basic mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:110 +msgid "Feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:111 +msgid "The feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:115 +msgid "Feed must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:116 +msgid "The feed %s must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:121 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:122 +msgid "This feed has already been added to the recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 +msgid "Invalid input" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 +msgid "<p>Could not create recipe. Error:<br>%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 +msgid "A custom recipe named %s already exists. Do you want to replace it?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Choose a recipe file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +msgid "Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 +msgid "Add custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 +msgid "Available user recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 +msgid "Add/Update &recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 +msgid "&Remove recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 +msgid "&Share recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 +msgid "&Load recipe from file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:203 +msgid "" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +"type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; " +"font-weight:400; font-style:normal;\">\n" +"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-" +"right:0px; -qt-block-indent:0; text-indent:0px;\">Create a basic news " +"recipe, by adding RSS feeds to it. <br />For most feeds, you will have to " +"use the \"Advanced mode\" to further customize the fetch " +"process.</p></body></html>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 +msgid "Recipe &title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 +msgid "&Oldest article:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 +msgid "The oldest article to download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 +msgid " days" +msgstr " రోజులు" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 +msgid "&Max. number of articles per feed:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +msgid "Maximum number of articles to download per feed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +msgid "Feeds in recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +msgid "Remove feed from recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 +msgid "Add feed to recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +msgid "&Feed title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 +msgid "Feed &URL:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 +msgid "&Add feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:223 +msgid "" +"For help with writing advanced news recipes, please visit <a " +"href=\"http://calibre.kovidgoyal.net/user_manual/news.html\">User Recipes</a>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:224 +msgid "Recipe source code (python)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 +msgid "" +"<p>Set a regular expression pattern to use when trying to guess ebook " +"metadata from filenames. <p>A <a href=\"http://docs.python.org/lib/re-" +"syntax.html\">reference</a> on the syntax of regular expressions is " +"available.<p>Use the <b>Test</b> functionality below to test your regular " +"expression on a few sample filenames." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:98 +msgid "Regular &expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:99 +msgid "&Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:100 +msgid "File &name:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:101 +msgid "Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:102 +msgid "Title:" +msgstr "శీర్షిక:" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:103 +msgid "Regular expression group name (?P<title>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:61 +msgid "No match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +msgid "Authors:" +msgstr "రచయితలు:" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +msgid "Regular expression group name (?P<authors>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108 +msgid "Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109 +msgid "Regular expression group name (?P<series>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +msgid "Series index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +msgid "Regular expression group name (?P<series_index>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 +msgid "ISBN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 +msgid "Job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:314 +msgid "Status" +msgstr "స్థితి" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 +msgid "Progress" +msgstr "ప్రగతి" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:316 +msgid "Running time" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Error" +msgstr "పొరపాటు" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "Finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Waiting" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:346 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:384 +msgid "Cannot kill job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:377 +msgid "" +"Cannot kill jobs that are communicating with the device as this may cause " +"data corruption." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:381 +msgid "Cannot kill already completed jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:385 +msgid "Cannot kill waiting jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:241 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:755 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:238 +msgid "Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:247 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 +msgid "Double click to <b>edit</b> me<br><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:753 +msgid "Size (MB)" +msgstr "పరిమాణం (మెబై)" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:754 +msgid "Date" +msgstr "తేదీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:404 +msgid "Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:686 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:690 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:790 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +msgid "Configure Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +msgid "Use white background" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:50 +msgid "Hyphenate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:51 +msgid "<b>Changes will only take affect after a restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:63 +msgid " - LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:154 +msgid "No matches found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128 +msgid "LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:129 +msgid "Parsing LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:130 +msgid "LRF Viewer toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 +msgid "Next Page" +msgstr "తర్వాతి పేజీ" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 +msgid "Previous Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133 +msgid "Back" +msgstr "వెనుకకు" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134 +msgid "Forward" +msgstr "ముందుకి" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135 +msgid "Next match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:136 +msgid "Open ebook" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137 +msgid "Configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:81 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +msgid "" +"<p>For help visit <a " +"href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 +msgid "Send to main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:114 +msgid "Send to storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +msgid "Edit metadata individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:118 +msgid "Edit metadata in bulk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +msgid "" +"Add books recursively (One book per directory, assumes every ebook file is " +"the same book in a different format)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:123 +msgid "" +"Add books recursively (Multiple books per directory, assumes every ebook " +"file is a different book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +msgid "Save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +msgid "View" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:142 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:319 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 +msgid "Device database corrupted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:332 +msgid "" +"\n" +" <p>The database of books on the reader is corrupted. Try the " +"following:\n" +" <ol>\n" +" <li>Unplug the reader. Wait for it to finish regenerating " +"the database (i.e. wait till it is ready to be used). Plug it back in. Now " +"it should work with %(app)s. If not try the next step.</li>\n" +" <li>Quit %(app)s. Find the file media.xml in the reader's " +"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +"file. Re-connect it and start %(app)s.</li>\n" +" </ol>\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:458 +msgid "" +"<p>Books with the same title as the following already exist in the database. " +"Add them anyway?<ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:461 +msgid "Duplicates found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:433 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:491 +msgid "No space on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:492 +msgid "" +"<p>Cannot upload books to device there is no more free space available " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:527 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:652 +msgid "Sending books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:655 +msgid "No suitable formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 +msgid "" +"Could not upload the following books to the device, as no suitable formats " +"were found:<br><ul>%s</ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:669 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708 +msgid "Fetch news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:710 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:720 +msgid "News fetched. Uploading to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:800 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:739 +msgid "Starting Bulk conversion of %d books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +msgid "%s has no available formats." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:942 +msgid "Cannot configure while there are running jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:965 +msgid "Copying database to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 +msgid "Invalid database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:981 +msgid "" +"<p>An invalid database already exists at %s, delete it before trying to move " +"the existing database.<br>Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:989 +msgid "Could not move database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1010 +msgid "No detailed info available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1011 +msgid "No detailed information is available for books on the device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1053 +msgid "Error talking to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1054 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 +msgid "Conversion Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "Database does not exist" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1103 +msgid "" +"The directory in which the database should be: %s no longer exists. Please " +"choose a new database location." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1154 +msgid "" +"<span style=\"color:red; font-weight:bold\">Latest version: <a " +"href=\"%s\">%s</a></span>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "" +"%s has been updated to version %s. See the <a " +"href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. " +"Visit the download page?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1160 +msgid "Update available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +msgid "calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +msgid "Advanced search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +msgid "Alt+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +msgid "" +"Search the list of books by title or author<br><br>Words separated by spaces " +"are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +msgid "" +"Search the list of books by title, author, publisher, tags and " +"comments<br><br>Words separated by spaces are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 +msgid "Reset Quick Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +msgid "Add books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +msgid "Edit meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +msgid "E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +msgid "Send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +msgid "S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +msgid "Fetch news" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +msgid "F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +msgid "Convert E-books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +msgid "C" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 +msgid "V" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:17 +msgid "" +"Redirect console output to a dialog window (both stdout and stderr). Useful " +"on windows where GUI apps do not have a output streams." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:54 +msgid "ERROR: Unhandled exception" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 +msgid "Add a custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 +msgid "" +"<p>Please enter your username and password for %s<br>If you do not have one, " +"please subscribe to get access to the articles.<br/> Click OK to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 +msgid "Custom news sources" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to browse books by their covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:133 +msgid "Click to turn off Cover Browsing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:138 +msgid "" +"<p>Browsing books by their covers is disabled.<br>Import of pictureflow " +"module failed:<br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:38 +msgid "Invalid regular expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:39 +msgid "Invalid regular expression: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:169 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:170 +msgid "" +"Reader\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:171 +msgid "" +"Card\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:175 +msgid "Click to see the list of books available on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:176 +msgid "Click to see the list of books in the main memory of your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:177 +msgid "Click to see the list of books on the storage card in your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:27 +msgid "" +"Path to the calibre database. Default is to use the path stored in the " +"settings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:82 +msgid "" +"%prog list [options]\n" +"\n" +"List the books available in the calibre database. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:90 +msgid "" +"The fields to display when listing books in the database. Should be a comma " +"separated list of fields.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:92 +msgid "" +"The field by which to sort the results.\n" +"Available fields: %s\n" +"Default: %%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:94 +msgid "Sort results in ascending order" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:96 +msgid "" +"Filter the results by the search query. For the format of the search query, " +"please see the search related documentation in the User Manual. Default is " +"to do no filtering." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:103 +msgid "Invalid fields. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:110 +msgid "Invalid sort field. Available fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:173 +msgid "" +"The following books were not added as they already exist in the database " +"(see --duplicates option):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:197 +msgid "" +"%prog add [options] file1 file2 file3 ...\n" +"\n" +"Add the specified files as books to the database. You can also specify " +"directories, see\n" +"the directory related options below. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:206 +msgid "" +"Assume that each directory has only a single logical book and that all files " +"in it are different e-book formats of that book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:208 +msgid "Process directories recursively" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:210 +msgid "" +"Add books to database even if they already exist. Comparison is done based " +"on book titles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +msgid "You must specify at least one file to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:233 +msgid "" +"%prog remove ids\n" +"\n" +"Remove the books identified by ids from the database. ids should be a comma " +"separated list of id numbers (you can get id numbers by using the list " +"command). For example, 23,34,57-85\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:245 +msgid "You must specify at least one book to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:265 +msgid "" +"%prog add_format [options] id ebook_file\n" +"\n" +"Add the ebook in ebook_file to the available formats for the logical book " +"identified by id. You can get id by using the list command. If the format " +"already exists, it is replaced.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:276 +msgid "You must specify an id and an ebook file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +msgid "ebook file must have an extension" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +msgid "" +"\n" +"%prog remove_format [options] id fmt\n" +"\n" +"Remove the format fmt from the logical book identified by id. You can get id " +"by using the list command. fmt should be a file extension like LRF or TXT or " +"EPUB. If the logical book does not have fmt available, do nothing.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:302 +msgid "You must specify an id and a format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:320 +msgid "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Show the metadata stored in the calibre database for the book identified by " +"id. \n" +"id is an id number from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:328 +msgid "Print metadata in OPF form (XML)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:333 +msgid "You must specify an id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:347 +msgid "" +"\n" +"%prog set_metadata [options] id /path/to/metadata.opf\n" +"\n" +"Set the metadata stored in the calibre database for the book identified by " +"id\n" +"from the OPF file metadata.opf. id is an id number from the list command. " +"You \n" +"can get a quick feel for the OPF format by using the --as-opf switch to the\n" +"show_metadata command.\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:360 +msgid "You must specify an id and a metadata file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:372 +msgid "" +"%prog export [options] ids \n" +"\n" +"Export the books specified by ids (a comma separated list) to the " +"filesystem.\n" +"The export operation saves all formats of the book, its cover and metadata " +"(in \n" +"an opf file). You can get id numbers from the list command. \n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +msgid "Export all books in database, ignoring the list of ids." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +msgid "Export books to the specified directory. Default is" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +msgid "Export all books into a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +msgid "Create file names as author - title instead of title - author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +msgid "You must specify some ids or the %s option" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:401 +msgid "" +"%%prog command [options] [arguments]\n" +"\n" +"%%prog is the command line interface to the calibre books database. \n" +"\n" +"command is one of:\n" +" %s\n" +" \n" +"For help on an individual command: %%prog command --help\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/parallel.py:317 +msgid "Could not launch worker process." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:146 +msgid "Could not initialize the fontconfig library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 +msgid "URL must have the scheme sftp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:57 +msgid "host must be of the form user@hostname" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:68 +msgid "Failed to negotiate SSH session: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/sftp.py:71 +msgid "Failed to authenticate with server: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:77 +msgid "Unknown feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:117 +msgid "Untitled article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:15 +msgid "" +"%%prog [options] ARG\n" +"\n" +"%%prog parses an online source of articles, like an RSS or ATOM feed and \n" +"fetches the article contents organized in a nice hierarchy.\n" +"\n" +"ARG can be one of:\n" +"\n" +"file name - %%prog will try to load a recipe from the file\n" +"\n" +"builtin recipe title - %%prog will load the builtin recipe and use it to " +"fetch the feed. For e.g. Newsweek or \"The BBC\" or \"The New York Times\"\n" +"\n" +"recipe as a string - %%prog will load the recipe directly from the string " +"arg.\n" +"\n" +"Available builtin recipes are:\n" +"%s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37 +msgid "" +"Options to control web2disk (used to fetch websites linked from feeds)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:40 +msgid "" +"Specify a list of feeds to download. For example: \n" +"\"['http://feeds.newsweek.com/newsweek/TopNews', " +"'http://feeds.newsweek.com/headlines/politics']\"\n" +"If you specify this option, any argument to %prog is ignored and a default " +"recipe is used to download the feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 +msgid "Be more verbose while processing." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 +msgid "" +"The title for this recipe. Used as the title for any ebooks created from the " +"downloaded feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:47 +msgid "Username for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:48 +msgid "Password for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:51 +msgid "" +"Number of levels of links to follow on webpages that are linked to from " +"feeds. Defaul %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53 +msgid "" +"The directory in which to store the downloaded feeds. Defaults to the " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55 +msgid "Dont show the progress bar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 +msgid "Very verbose output, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 +msgid "" +"Useful for recipe development. Forces max_articles_per_feed to 2 and " +"downloads at most 2 feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:576 +msgid "Fetching feeds..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:33 +msgid "Unknown News Source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:474 +msgid "Download finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:476 +msgid "Failed to download the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:478 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:484 +msgid " from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:482 +msgid "Failed to download parts of the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:486 +msgid "\tFailed links:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:558 +msgid "Could not fetch article. Run with --debug to see the reason" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 +msgid "Got feeds from index page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:584 +msgid "Trying to download cover..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:636 +msgid "Starting download [%d thread(s)]..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:649 +msgid "Feeds downloaded to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:659 +msgid "Could not download cover: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:664 +msgid "Downloading cover from %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +msgid "Untitled Article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:743 +msgid "" +"\n" +"Downloaded article %s from %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:749 +msgid "Article downloaded: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:755 +msgid "Failed to download article: %s from %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:760 +msgid "Article download failed: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:775 +msgid "Fetching feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:382 +msgid "" +"%prog URL\n" +"\n" +"Where URL is for example http://google.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:385 +msgid "Base directory into which URL is saved. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:388 +msgid "" +"Timeout in seconds to wait for a response from the server. Default: %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:391 +msgid "" +"Maximum number of levels to recurse i.e. depth of links to follow. Default " +"%default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:394 +msgid "" +"The maximum number of files to download. This only applies to files from <a " +"href> tags. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:396 +msgid "" +"Minimum interval in seconds between consecutive fetches. Default is %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:398 +msgid "" +"The character encoding for the websites you are trying to download. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:400 +msgid "" +"Only links that match this regular expression will be followed. This option " +"can be specified multiple times, in which case as long as a link matches any " +"one regexp, it will be followed. By default all links are followed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:402 +msgid "" +"Any link that matches this regular expression will be ignored. This option " +"can be specified multiple times, in which case as long as any regexp matches " +"a link, it will be ignored.By default, no links are ignored. If both --" +"filter-regexp and --match-regexp are specified, then --filter-regexp is " +"applied first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:404 +msgid "Do not download CSS stylesheets." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:405 +msgid "Show detailed output information. Useful for debugging" +msgstr "" diff --git a/src/calibre/utils/fontconfig.py b/src/calibre/utils/fontconfig.py index 9d96de0a76..fe2261d853 100644 --- a/src/calibre/utils/fontconfig.py +++ b/src/calibre/utils/fontconfig.py @@ -23,7 +23,7 @@ match to a given font specification. The main functions in this module are: ''' import sys, os, locale, codecs -from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, \ +from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, util, \ pointer, byref, create_string_buffer, Union, c_char_p, c_double try: @@ -36,18 +36,20 @@ iswindows = 'win32' in sys.platform or 'win64' in sys.platform isosx = 'darwin' in sys.platform def load_library(): - if isosx: - lib = 'libfontconfig.1.dylib' - if hasattr(sys, 'frameworks_dir'): - lib = os.path.join(getattr(sys, 'frameworks_dir'), lib) + if isosx: + lib = os.path.join(getattr(sys, 'frameworks_dir'), 'libfontconfig.1.dylib') \ + if hasattr(sys, 'frameworks_dir') else util.find_library('fontconfig') return cdll.LoadLibrary(lib) elif iswindows: return cdll.LoadLibrary('libfontconfig-1') else: try: - return cdll.LoadLibrary('libfontconfig.so') + return cdll.LoadLibrary(util.find_library('fontconfig')) except: - return cdll.LoadLibrary('libfontconfig.so.1') + try: + return cdll.LoadLibrary('libfontconfig.so') + except: + return cdll.LoadLibrary('libfontconfig.so.1') class FcPattern(Structure): _fields_ = [ @@ -118,9 +120,29 @@ lib.FcFontSort.argtypes = [c_void_p, POINTER(FcPattern), c_int, c_void_p, POINTE lib.FcFontSort.restype = POINTER(FcFontSet) lib.FcFontRenderPrepare.argtypes = [c_void_p, POINTER(FcPattern), POINTER(FcPattern)] lib.FcFontRenderPrepare.restype = POINTER(FcPattern) +lib.FcConfigCreate.restype = c_void_p +lib.FcConfigSetCurrent.argtypes = [c_void_p] +lib.FcConfigSetCurrent.restype = c_int +lib.FcConfigParseAndLoad.argtypes = [c_void_p, POINTER(c_char), c_int] +lib.FcConfigParseAndLoad.restype = c_int +lib.FcConfigBuildFonts.argtypes = [c_void_p] +lib.FcConfigBuildFonts.restype = c_int -if not lib.FcInit(): +# Initialize the fontconfig library. This has to be done manually +# for the OS X bundle as it has its own private fontconfig. +if hasattr(sys, 'frameworks_dir'): + config_dir = os.path.join(os.path.dirname(getattr(sys, 'frameworks_dir')), 'Resources', 'fonts') + if isinstance(config_dir, unicode): + config_dir = config_dir.encode(sys.getfilesystemencoding()) + config = lib.FcConfigCreate() + if not lib.FcConfigParseAndLoad(config, os.path.join(config_dir, 'fonts.conf'), 1): + raise RuntimeError('Could not parse the fontconfig configuration') + if not lib.FcConfigBuildFonts(config): + raise RuntimeError('Could not build fonts') + if not lib.FcConfigSetCurrent(config): + raise RuntimeError('Could not set font config') +elif not lib.FcInit(): raise RuntimeError(_('Could not initialize the fontconfig library')) def find_font_families(allowed_extensions=['ttf']): @@ -151,11 +173,10 @@ def find_font_families(allowed_extensions=['ttf']): ext = os.path.splitext(path)[1] if ext: ext = ext[1:].lower() - if allowed_extensions and ext in allowed_extensions: + if (not allowed_extensions) or (allowed_extensions and ext in allowed_extensions): if lib.FcPatternGetString(pat, 'family', 0, byref(family)) != FcResultMatch.value: raise RuntimeError('Error processing pattern') font_families.append(str(family.contents.value)) - lib.FcObjectSetDestroy(oset) lib.FcPatternDestroy(empty_pattern) diff --git a/src/calibre/utils/genshi/__init__.py b/src/calibre/utils/genshi/__init__.py new file mode 100644 index 0000000000..51843d2b69 --- /dev/null +++ b/src/calibre/utils/genshi/__init__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""This package provides various means for generating and processing web markup +(XML or HTML). + +The design is centered around the concept of streams of markup events (similar +in concept to SAX parsing events) which can be processed in a uniform manner +independently of where or how they are produced. +""" + +__docformat__ = 'restructuredtext en' +try: + __version__ = __import__('pkg_resources').get_distribution('Genshi').version +except: + pass + +from calibre.utils.genshi.core import * +from calibre.utils.genshi.input import ParseError, XML, HTML diff --git a/src/calibre/utils/genshi/builder.py b/src/calibre/utils/genshi/builder.py new file mode 100644 index 0000000000..fac6185f0a --- /dev/null +++ b/src/calibre/utils/genshi/builder.py @@ -0,0 +1,362 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Support for programmatically generating markup streams from Python code using +a very simple syntax. The main entry point to this module is the `tag` object +(which is actually an instance of the ``ElementFactory`` class). You should +rarely (if ever) need to directly import and use any of the other classes in +this module. + +Elements can be created using the `tag` object using attribute access. For +example: + +>>> doc = tag.p('Some text and ', tag.a('a link', href='http://example.org/'), '.') +>>> doc +<Element "p"> + +This produces an `Element` instance which can be further modified to add child +nodes and attributes. This is done by "calling" the element: positional +arguments are added as child nodes (alternatively, the `Element.append` method +can be used for that purpose), whereas keywords arguments are added as +attributes: + +>>> doc(tag.br) +<Element "p"> +>>> print doc +<p>Some text and <a href="http://example.org/">a link</a>.<br/></p> + +If an attribute name collides with a Python keyword, simply append an underscore +to the name: + +>>> doc(class_='intro') +<Element "p"> +>>> print doc +<p class="intro">Some text and <a href="http://example.org/">a link</a>.<br/></p> + +As shown above, an `Element` can easily be directly rendered to XML text by +printing it or using the Python ``str()`` function. This is basically a +shortcut for converting the `Element` to a stream and serializing that +stream: + +>>> stream = doc.generate() +>>> stream #doctest: +ELLIPSIS +<genshi.core.Stream object at ...> +>>> print stream +<p class="intro">Some text and <a href="http://example.org/">a link</a>.<br/></p> + + +The `tag` object also allows creating "fragments", which are basically lists +of nodes (elements or text) that don't have a parent element. This can be useful +for creating snippets of markup that are attached to a parent element later (for +example in a template). Fragments are created by calling the `tag` object, which +returns an object of type `Fragment`: + +>>> fragment = tag('Hello, ', tag.em('world'), '!') +>>> fragment +<Fragment> +>>> print fragment +Hello, <em>world</em>! +""" + +try: + set +except NameError: + from sets import Set as set + +from calibre.utils.genshi.core import Attrs, Markup, Namespace, QName, Stream, \ + START, END, TEXT + +__all__ = ['Fragment', 'Element', 'ElementFactory', 'tag'] +__docformat__ = 'restructuredtext en' + + +class Fragment(object): + """Represents a markup fragment, which is basically just a list of element + or text nodes. + """ + __slots__ = ['children'] + + def __init__(self): + """Create a new fragment.""" + self.children = [] + + def __add__(self, other): + return Fragment()(self, other) + + def __call__(self, *args): + """Append any positional arguments as child nodes. + + :see: `append` + """ + map(self.append, args) + return self + + def __iter__(self): + return self._generate() + + def __repr__(self): + return '<%s>' % self.__class__.__name__ + + def __str__(self): + return str(self.generate()) + + def __unicode__(self): + return unicode(self.generate()) + + def __html__(self): + return Markup(self.generate()) + + def append(self, node): + """Append an element or string as child node. + + :param node: the node to append; can be an `Element`, `Fragment`, or a + `Stream`, or a Python string or number + """ + if isinstance(node, (Stream, Element, basestring, int, float, long)): + # For objects of a known/primitive type, we avoid the check for + # whether it is iterable for better performance + self.children.append(node) + elif isinstance(node, Fragment): + self.children.extend(node.children) + elif node is not None: + try: + map(self.append, iter(node)) + except TypeError: + self.children.append(node) + + def _generate(self): + for child in self.children: + if isinstance(child, Fragment): + for event in child._generate(): + yield event + elif isinstance(child, Stream): + for event in child: + yield event + else: + if not isinstance(child, basestring): + child = unicode(child) + yield TEXT, child, (None, -1, -1) + + def generate(self): + """Return a markup event stream for the fragment. + + :rtype: `Stream` + """ + return Stream(self._generate()) + + +def _kwargs_to_attrs(kwargs): + attrs = [] + names = set() + for name, value in kwargs.items(): + name = name.rstrip('_').replace('_', '-') + if value is not None and name not in names: + attrs.append((QName(name), unicode(value))) + names.add(name) + return Attrs(attrs) + + +class Element(Fragment): + """Simple XML output generator based on the builder pattern. + + Construct XML elements by passing the tag name to the constructor: + + >>> print Element('strong') + <strong/> + + Attributes can be specified using keyword arguments. The values of the + arguments will be converted to strings and any special XML characters + escaped: + + >>> print Element('textarea', rows=10, cols=60) + <textarea rows="10" cols="60"/> + >>> print Element('span', title='1 < 2') + <span title="1 < 2"/> + >>> print Element('span', title='"baz"') + <span title=""baz""/> + + The " character is escaped using a numerical entity. + The order in which attributes are rendered is undefined. + + If an attribute value evaluates to `None`, that attribute is not included + in the output: + + >>> print Element('a', name=None) + <a/> + + Attribute names that conflict with Python keywords can be specified by + appending an underscore: + + >>> print Element('div', class_='warning') + <div class="warning"/> + + Nested elements can be added to an element using item access notation. + The call notation can also be used for this and for adding attributes + using keyword arguments, as one would do in the constructor. + + >>> print Element('ul')(Element('li'), Element('li')) + <ul><li/><li/></ul> + >>> print Element('a')('Label') + <a>Label</a> + >>> print Element('a')('Label', href="target") + <a href="target">Label</a> + + Text nodes can be nested in an element by adding strings instead of + elements. Any special characters in the strings are escaped automatically: + + >>> print Element('em')('Hello world') + <em>Hello world</em> + >>> print Element('em')(42) + <em>42</em> + >>> print Element('em')('1 < 2') + <em>1 < 2</em> + + This technique also allows mixed content: + + >>> print Element('p')('Hello ', Element('b')('world')) + <p>Hello <b>world</b></p> + + Quotes are not escaped inside text nodes: + >>> print Element('p')('"Hello"') + <p>"Hello"</p> + + Elements can also be combined with other elements or strings using the + addition operator, which results in a `Fragment` object that contains the + operands: + + >>> print Element('br') + 'some text' + Element('br') + <br/>some text<br/> + + Elements with a namespace can be generated using the `Namespace` and/or + `QName` classes: + + >>> from genshi.core import Namespace + >>> xhtml = Namespace('http://www.w3.org/1999/xhtml') + >>> print Element(xhtml.html, lang='en') + <html xmlns="http://www.w3.org/1999/xhtml" lang="en"/> + """ + __slots__ = ['tag', 'attrib'] + + def __init__(self, tag_, **attrib): + Fragment.__init__(self) + self.tag = QName(tag_) + self.attrib = _kwargs_to_attrs(attrib) + + def __call__(self, *args, **kwargs): + """Append any positional arguments as child nodes, and keyword arguments + as attributes. + + :return: the element itself so that calls can be chained + :rtype: `Element` + :see: `Fragment.append` + """ + self.attrib |= _kwargs_to_attrs(kwargs) + Fragment.__call__(self, *args) + return self + + def __repr__(self): + return '<%s "%s">' % (self.__class__.__name__, self.tag) + + def _generate(self): + yield START, (self.tag, self.attrib), (None, -1, -1) + for kind, data, pos in Fragment._generate(self): + yield kind, data, pos + yield END, self.tag, (None, -1, -1) + + def generate(self): + """Return a markup event stream for the fragment. + + :rtype: `Stream` + """ + return Stream(self._generate()) + + +class ElementFactory(object): + """Factory for `Element` objects. + + A new element is created simply by accessing a correspondingly named + attribute of the factory object: + + >>> factory = ElementFactory() + >>> print factory.foo + <foo/> + >>> print factory.foo(id=2) + <foo id="2"/> + + Markup fragments (lists of nodes without a parent element) can be created + by calling the factory: + + >>> print factory('Hello, ', factory.em('world'), '!') + Hello, <em>world</em>! + + A factory can also be bound to a specific namespace: + + >>> factory = ElementFactory('http://www.w3.org/1999/xhtml') + >>> print factory.html(lang="en") + <html xmlns="http://www.w3.org/1999/xhtml" lang="en"/> + + The namespace for a specific element can be altered on an existing factory + by specifying the new namespace using item access: + + >>> factory = ElementFactory() + >>> print factory.html(factory['http://www.w3.org/2000/svg'].g(id=3)) + <html><g xmlns="http://www.w3.org/2000/svg" id="3"/></html> + + Usually, the `ElementFactory` class is not be used directly. Rather, the + `tag` instance should be used to create elements. + """ + + def __init__(self, namespace=None): + """Create the factory, optionally bound to the given namespace. + + :param namespace: the namespace URI for any created elements, or `None` + for no namespace + """ + if namespace and not isinstance(namespace, Namespace): + namespace = Namespace(namespace) + self.namespace = namespace + + def __call__(self, *args): + """Create a fragment that has the given positional arguments as child + nodes. + + :return: the created `Fragment` + :rtype: `Fragment` + """ + return Fragment()(*args) + + def __getitem__(self, namespace): + """Return a new factory that is bound to the specified namespace. + + :param namespace: the namespace URI or `Namespace` object + :return: an `ElementFactory` that produces elements bound to the given + namespace + :rtype: `ElementFactory` + """ + return ElementFactory(namespace) + + def __getattr__(self, name): + """Create an `Element` with the given name. + + :param name: the tag name of the element to create + :return: an `Element` with the specified name + :rtype: `Element` + """ + return Element(self.namespace and self.namespace[name] or name) + + +tag = ElementFactory() +"""Global `ElementFactory` bound to the default namespace. + +:type: `ElementFactory` +""" diff --git a/src/calibre/utils/genshi/core.py b/src/calibre/utils/genshi/core.py new file mode 100644 index 0000000000..aaa10edc82 --- /dev/null +++ b/src/calibre/utils/genshi/core.py @@ -0,0 +1,705 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Core classes for markup processing.""" + +from itertools import chain +import operator + +from calibre.utils.genshi.util import plaintext, stripentities, striptags + +__all__ = ['Stream', 'Markup', 'escape', 'unescape', 'Attrs', 'Namespace', + 'QName'] +__docformat__ = 'restructuredtext en' + + +class StreamEventKind(str): + """A kind of event on a markup stream.""" + __slots__ = [] + _instances = {} + + def __new__(cls, val): + return cls._instances.setdefault(val, str.__new__(cls, val)) + + +class Stream(object): + """Represents a stream of markup events. + + This class is basically an iterator over the events. + + Stream events are tuples of the form:: + + (kind, data, position) + + where ``kind`` is the event kind (such as `START`, `END`, `TEXT`, etc), + ``data`` depends on the kind of event, and ``position`` is a + ``(filename, line, offset)`` tuple that contains the location of the + original element or text in the input. If the original location is unknown, + ``position`` is ``(None, -1, -1)``. + + Also provided are ways to serialize the stream to text. The `serialize()` + method will return an iterator over generated strings, while `render()` + returns the complete generated text at once. Both accept various parameters + that impact the way the stream is serialized. + """ + __slots__ = ['events', 'serializer'] + + START = StreamEventKind('START') #: a start tag + END = StreamEventKind('END') #: an end tag + TEXT = StreamEventKind('TEXT') #: literal text + XML_DECL = StreamEventKind('XML_DECL') #: XML declaration + DOCTYPE = StreamEventKind('DOCTYPE') #: doctype declaration + START_NS = StreamEventKind('START_NS') #: start namespace mapping + END_NS = StreamEventKind('END_NS') #: end namespace mapping + START_CDATA = StreamEventKind('START_CDATA') #: start CDATA section + END_CDATA = StreamEventKind('END_CDATA') #: end CDATA section + PI = StreamEventKind('PI') #: processing instruction + COMMENT = StreamEventKind('COMMENT') #: comment + + def __init__(self, events, serializer=None): + """Initialize the stream with a sequence of markup events. + + :param events: a sequence or iterable providing the events + :param serializer: the default serialization method to use for this + stream + + :note: Changed in 0.5: added the `serializer` argument + """ + self.events = events #: The underlying iterable producing the events + self.serializer = serializer #: The default serializion method + + def __iter__(self): + return iter(self.events) + + def __or__(self, function): + """Override the "bitwise or" operator to apply filters or serializers + to the stream, providing a syntax similar to pipes on Unix shells. + + Assume the following stream produced by the `HTML` function: + + >>> from genshi.input import HTML + >>> html = HTML('''<p onclick="alert('Whoa')">Hello, world!</p>''') + >>> print html + <p onclick="alert('Whoa')">Hello, world!</p> + + A filter such as the HTML sanitizer can be applied to that stream using + the pipe notation as follows: + + >>> from genshi.filters import HTMLSanitizer + >>> sanitizer = HTMLSanitizer() + >>> print html | sanitizer + <p>Hello, world!</p> + + Filters can be any function that accepts and produces a stream (where + a stream is anything that iterates over events): + + >>> def uppercase(stream): + ... for kind, data, pos in stream: + ... if kind is TEXT: + ... data = data.upper() + ... yield kind, data, pos + >>> print html | sanitizer | uppercase + <p>HELLO, WORLD!</p> + + Serializers can also be used with this notation: + + >>> from genshi.output import TextSerializer + >>> output = TextSerializer() + >>> print html | sanitizer | uppercase | output + HELLO, WORLD! + + Commonly, serializers should be used at the end of the "pipeline"; + using them somewhere in the middle may produce unexpected results. + + :param function: the callable object that should be applied as a filter + :return: the filtered stream + :rtype: `Stream` + """ + return Stream(_ensure(function(self)), serializer=self.serializer) + + def filter(self, *filters): + """Apply filters to the stream. + + This method returns a new stream with the given filters applied. The + filters must be callables that accept the stream object as parameter, + and return the filtered stream. + + The call:: + + stream.filter(filter1, filter2) + + is equivalent to:: + + stream | filter1 | filter2 + + :param filters: one or more callable objects that should be applied as + filters + :return: the filtered stream + :rtype: `Stream` + """ + return reduce(operator.or_, (self,) + filters) + + def render(self, method=None, encoding='utf-8', out=None, **kwargs): + """Return a string representation of the stream. + + Any additional keyword arguments are passed to the serializer, and thus + depend on the `method` parameter value. + + :param method: determines how the stream is serialized; can be either + "xml", "xhtml", "html", "text", or a custom serializer + class; if `None`, the default serialization method of + the stream is used + :param encoding: how the output string should be encoded; if set to + `None`, this method returns a `unicode` object + :param out: a file-like object that the output should be written to + instead of being returned as one big string; note that if + this is a file or socket (or similar), the `encoding` must + not be `None` (that is, the output must be encoded) + :return: a `str` or `unicode` object (depending on the `encoding` + parameter), or `None` if the `out` parameter is provided + :rtype: `basestring` + + :see: XMLSerializer, XHTMLSerializer, HTMLSerializer, TextSerializer + :note: Changed in 0.5: added the `out` parameter + """ + from calibre.utils.genshi.output import encode + if method is None: + method = self.serializer or 'xml' + generator = self.serialize(method=method, **kwargs) + return encode(generator, method=method, encoding=encoding, out=out) + + def select(self, path, namespaces=None, variables=None): + """Return a new stream that contains the events matching the given + XPath expression. + + >>> from genshi import HTML + >>> stream = HTML('<doc><elem>foo</elem><elem>bar</elem></doc>') + >>> print stream.select('elem') + <elem>foo</elem><elem>bar</elem> + >>> print stream.select('elem/text()') + foobar + + Note that the outermost element of the stream becomes the *context + node* for the XPath test. That means that the expression "doc" would + not match anything in the example above, because it only tests against + child elements of the outermost element: + + >>> print stream.select('doc') + <BLANKLINE> + + You can use the "." expression to match the context node itself + (although that usually makes little sense): + + >>> print stream.select('.') + <doc><elem>foo</elem><elem>bar</elem></doc> + + :param path: a string containing the XPath expression + :param namespaces: mapping of namespace prefixes used in the path + :param variables: mapping of variable names to values + :return: the selected substream + :rtype: `Stream` + :raises PathSyntaxError: if the given path expression is invalid or not + supported + """ + from genshi.path import Path + return Path(path).select(self, namespaces, variables) + + def serialize(self, method='xml', **kwargs): + """Generate strings corresponding to a specific serialization of the + stream. + + Unlike the `render()` method, this method is a generator that returns + the serialized output incrementally, as opposed to returning a single + string. + + Any additional keyword arguments are passed to the serializer, and thus + depend on the `method` parameter value. + + :param method: determines how the stream is serialized; can be either + "xml", "xhtml", "html", "text", or a custom serializer + class; if `None`, the default serialization method of + the stream is used + :return: an iterator over the serialization results (`Markup` or + `unicode` objects, depending on the serialization method) + :rtype: ``iterator`` + :see: XMLSerializer, XHTMLSerializer, HTMLSerializer, TextSerializer + """ + from calibre.utils.genshi.output import get_serializer + if method is None: + method = self.serializer or 'xml' + return get_serializer(method, **kwargs)(_ensure(self)) + + def __str__(self): + return self.render() + + def __unicode__(self): + return self.render(encoding=None) + + def __html__(self): + return self + + +START = Stream.START +END = Stream.END +TEXT = Stream.TEXT +XML_DECL = Stream.XML_DECL +DOCTYPE = Stream.DOCTYPE +START_NS = Stream.START_NS +END_NS = Stream.END_NS +START_CDATA = Stream.START_CDATA +END_CDATA = Stream.END_CDATA +PI = Stream.PI +COMMENT = Stream.COMMENT + +def _ensure(stream): + """Ensure that every item on the stream is actually a markup event.""" + stream = iter(stream) + event = stream.next() + + # Check whether the iterable is a real markup event stream by examining the + # first item it yields; if it's not we'll need to do some conversion + if type(event) is not tuple or len(event) != 3: + for event in chain([event], stream): + if hasattr(event, 'totuple'): + event = event.totuple() + else: + event = TEXT, unicode(event), (None, -1, -1) + yield event + return + + # This looks like a markup event stream, so we'll just pass it through + # unchanged + yield event + for event in stream: + yield event + + +class Attrs(tuple): + """Immutable sequence type that stores the attributes of an element. + + Ordering of the attributes is preserved, while access by name is also + supported. + + >>> attrs = Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs + Attrs([('href', '#'), ('title', 'Foo')]) + + >>> 'href' in attrs + True + >>> 'tabindex' in attrs + False + >>> attrs.get('title') + 'Foo' + + Instances may not be manipulated directly. Instead, the operators ``|`` and + ``-`` can be used to produce new instances that have specific attributes + added, replaced or removed. + + To remove an attribute, use the ``-`` operator. The right hand side can be + either a string or a set/sequence of strings, identifying the name(s) of + the attribute(s) to remove: + + >>> attrs - 'title' + Attrs([('href', '#')]) + >>> attrs - ('title', 'href') + Attrs() + + The original instance is not modified, but the operator can of course be + used with an assignment: + + >>> attrs + Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs -= 'title' + >>> attrs + Attrs([('href', '#')]) + + To add a new attribute, use the ``|`` operator, where the right hand value + is a sequence of ``(name, value)`` tuples (which includes `Attrs` + instances): + + >>> attrs | [('title', 'Bar')] + Attrs([('href', '#'), ('title', 'Bar')]) + + If the attributes already contain an attribute with a given name, the value + of that attribute is replaced: + + >>> attrs | [('href', 'http://example.org/')] + Attrs([('href', 'http://example.org/')]) + """ + __slots__ = [] + + def __contains__(self, name): + """Return whether the list includes an attribute with the specified + name. + + :return: `True` if the list includes the attribute + :rtype: `bool` + """ + for attr, _ in self: + if attr == name: + return True + + def __getslice__(self, i, j): + """Return a slice of the attributes list. + + >>> attrs = Attrs([('href', '#'), ('title', 'Foo')]) + >>> attrs[1:] + Attrs([('title', 'Foo')]) + """ + return Attrs(tuple.__getslice__(self, i, j)) + + def __or__(self, attrs): + """Return a new instance that contains the attributes in `attrs` in + addition to any already existing attributes. + + :return: a new instance with the merged attributes + :rtype: `Attrs` + """ + repl = dict([(an, av) for an, av in attrs if an in self]) + return Attrs([(sn, repl.get(sn, sv)) for sn, sv in self] + + [(an, av) for an, av in attrs if an not in self]) + + def __repr__(self): + if not self: + return 'Attrs()' + return 'Attrs([%s])' % ', '.join([repr(item) for item in self]) + + def __sub__(self, names): + """Return a new instance with all attributes with a name in `names` are + removed. + + :param names: the names of the attributes to remove + :return: a new instance with the attribute removed + :rtype: `Attrs` + """ + if isinstance(names, basestring): + names = (names,) + return Attrs([(name, val) for name, val in self if name not in names]) + + def get(self, name, default=None): + """Return the value of the attribute with the specified name, or the + value of the `default` parameter if no such attribute is found. + + :param name: the name of the attribute + :param default: the value to return when the attribute does not exist + :return: the attribute value, or the `default` value if that attribute + does not exist + :rtype: `object` + """ + for attr, value in self: + if attr == name: + return value + return default + + def totuple(self): + """Return the attributes as a markup event. + + The returned event is a `TEXT` event, the data is the value of all + attributes joined together. + + >>> Attrs([('href', '#'), ('title', 'Foo')]).totuple() + ('TEXT', u'#Foo', (None, -1, -1)) + + :return: a `TEXT` event + :rtype: `tuple` + """ + return TEXT, u''.join([x[1] for x in self]), (None, -1, -1) + + +class Markup(unicode): + """Marks a string as being safe for inclusion in HTML/XML output without + needing to be escaped. + """ + __slots__ = [] + + def __add__(self, other): + return Markup(unicode(self) + unicode(escape(other))) + + def __radd__(self, other): + return Markup(unicode(escape(other)) + unicode(self)) + + def __mod__(self, args): + if isinstance(args, dict): + args = dict(zip(args.keys(), map(escape, args.values()))) + elif isinstance(args, (list, tuple)): + args = tuple(map(escape, args)) + else: + args = escape(args) + return Markup(unicode.__mod__(self, args)) + + def __mul__(self, num): + return Markup(unicode(self) * num) + + def __rmul__(self, num): + return Markup(num * unicode(self)) + + def __repr__(self): + return '<%s %r>' % (self.__class__.__name__, unicode(self)) + + def join(self, seq, escape_quotes=True): + """Return a `Markup` object which is the concatenation of the strings + in the given sequence, where this `Markup` object is the separator + between the joined elements. + + Any element in the sequence that is not a `Markup` instance is + automatically escaped. + + :param seq: the sequence of strings to join + :param escape_quotes: whether double quote characters in the elements + should be escaped + :return: the joined `Markup` object + :rtype: `Markup` + :see: `escape` + """ + return Markup(unicode(self).join([escape(item, quotes=escape_quotes) + for item in seq])) + + def escape(cls, text, quotes=True): + """Create a Markup instance from a string and escape special characters + it may contain (<, >, & and \"). + + >>> escape('"1 < 2"') + <Markup u'"1 < 2"'> + + If the `quotes` parameter is set to `False`, the \" character is left + as is. Escaping quotes is generally only required for strings that are + to be used in attribute values. + + >>> escape('"1 < 2"', quotes=False) + <Markup u'"1 < 2"'> + + :param text: the text to escape + :param quotes: if ``True``, double quote characters are escaped in + addition to the other special characters + :return: the escaped `Markup` string + :rtype: `Markup` + """ + if not text: + return cls() + if type(text) is cls: + return text + if hasattr(text, '__html__'): + return Markup(text.__html__()) + + text = unicode(text).replace('&', '&') \ + .replace('<', '<') \ + .replace('>', '>') + if quotes: + text = text.replace('"', '"') + return cls(text) + escape = classmethod(escape) + + def unescape(self): + """Reverse-escapes &, <, >, and \" and returns a `unicode` object. + + >>> Markup('1 < 2').unescape() + u'1 < 2' + + :return: the unescaped string + :rtype: `unicode` + :see: `genshi.core.unescape` + """ + if not self: + return u'' + return unicode(self).replace('"', '"') \ + .replace('>', '>') \ + .replace('<', '<') \ + .replace('&', '&') + + def stripentities(self, keepxmlentities=False): + """Return a copy of the text with any character or numeric entities + replaced by the equivalent UTF-8 characters. + + If the `keepxmlentities` parameter is provided and evaluates to `True`, + the core XML entities (``&``, ``'``, ``>``, ``<`` and + ``"``) are not stripped. + + :return: a `Markup` instance with entities removed + :rtype: `Markup` + :see: `genshi.util.stripentities` + """ + return Markup(stripentities(self, keepxmlentities=keepxmlentities)) + + def striptags(self): + """Return a copy of the text with all XML/HTML tags removed. + + :return: a `Markup` instance with all tags removed + :rtype: `Markup` + :see: `genshi.util.striptags` + """ + return Markup(striptags(self)) + + +try: + from calibre.utils.genshi._speedups import Markup +except ImportError: + pass # just use the Python implementation + +escape = Markup.escape + +def unescape(text): + """Reverse-escapes &, <, >, and \" and returns a `unicode` object. + + >>> unescape(Markup('1 < 2')) + u'1 < 2' + + If the provided `text` object is not a `Markup` instance, it is returned + unchanged. + + >>> unescape('1 < 2') + '1 < 2' + + :param text: the text to unescape + :return: the unescsaped string + :rtype: `unicode` + """ + if not isinstance(text, Markup): + return text + return text.unescape() + + +class Namespace(object): + """Utility class creating and testing elements with a namespace. + + Internally, namespace URIs are encoded in the `QName` of any element or + attribute, the namespace URI being enclosed in curly braces. This class + helps create and test these strings. + + A `Namespace` object is instantiated with the namespace URI. + + >>> html = Namespace('http://www.w3.org/1999/xhtml') + >>> html + <Namespace "http://www.w3.org/1999/xhtml"> + >>> html.uri + u'http://www.w3.org/1999/xhtml' + + The `Namespace` object can than be used to generate `QName` objects with + that namespace: + + >>> html.body + QName(u'http://www.w3.org/1999/xhtml}body') + >>> html.body.localname + u'body' + >>> html.body.namespace + u'http://www.w3.org/1999/xhtml' + + The same works using item access notation, which is useful for element or + attribute names that are not valid Python identifiers: + + >>> html['body'] + QName(u'http://www.w3.org/1999/xhtml}body') + + A `Namespace` object can also be used to test whether a specific `QName` + belongs to that namespace using the ``in`` operator: + + >>> qname = html.body + >>> qname in html + True + >>> qname in Namespace('http://www.w3.org/2002/06/xhtml2') + False + """ + def __new__(cls, uri): + if type(uri) is cls: + return uri + return object.__new__(cls) + + def __getnewargs__(self): + return (self.uri,) + + def __getstate__(self): + return self.uri + + def __setstate__(self, uri): + self.uri = uri + + def __init__(self, uri): + self.uri = unicode(uri) + + def __contains__(self, qname): + return qname.namespace == self.uri + + def __ne__(self, other): + return not self == other + + def __eq__(self, other): + if isinstance(other, Namespace): + return self.uri == other.uri + return self.uri == other + + def __getitem__(self, name): + return QName(self.uri + u'}' + name) + __getattr__ = __getitem__ + + def __repr__(self): + return '<Namespace "%s">' % self.uri + + def __str__(self): + return self.uri.encode('utf-8') + + def __unicode__(self): + return self.uri + + +# The namespace used by attributes such as xml:lang and xml:space +XML_NAMESPACE = Namespace('http://www.w3.org/XML/1998/namespace') + + +class QName(unicode): + """A qualified element or attribute name. + + The unicode value of instances of this class contains the qualified name of + the element or attribute, in the form ``{namespace-uri}local-name``. The + namespace URI can be obtained through the additional `namespace` attribute, + while the local name can be accessed through the `localname` attribute. + + >>> qname = QName('foo') + >>> qname + QName(u'foo') + >>> qname.localname + u'foo' + >>> qname.namespace + + >>> qname = QName('http://www.w3.org/1999/xhtml}body') + >>> qname + QName(u'http://www.w3.org/1999/xhtml}body') + >>> qname.localname + u'body' + >>> qname.namespace + u'http://www.w3.org/1999/xhtml' + """ + __slots__ = ['namespace', 'localname'] + + def __new__(cls, qname): + """Create the `QName` instance. + + :param qname: the qualified name as a string of the form + ``{namespace-uri}local-name``, where the leading curly + brace is optional + """ + if type(qname) is cls: + return qname + + parts = qname.lstrip(u'{').split(u'}', 1) + if len(parts) > 1: + self = unicode.__new__(cls, u'{%s' % qname) + self.namespace, self.localname = map(unicode, parts) + else: + self = unicode.__new__(cls, qname) + self.namespace, self.localname = None, unicode(qname) + return self + + def __getnewargs__(self): + return (self.lstrip('{'),) + + def __repr__(self): + return 'QName(%s)' % unicode.__repr__(self.lstrip('{')) diff --git a/src/calibre/utils/genshi/filters/__init__.py b/src/calibre/utils/genshi/filters/__init__.py new file mode 100644 index 0000000000..828a348bdb --- /dev/null +++ b/src/calibre/utils/genshi/filters/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Implementation of a number of stream filters.""" + +from calibre.utils.genshi.filters.html import HTMLFormFiller, HTMLSanitizer +from calibre.utils.genshi.filters.i18n import Translator +from calibre.utils.genshi.filters.transform import Transformer + +__docformat__ = 'restructuredtext en' diff --git a/src/calibre/utils/genshi/filters/html.py b/src/calibre/utils/genshi/filters/html.py new file mode 100644 index 0000000000..59eafda919 --- /dev/null +++ b/src/calibre/utils/genshi/filters/html.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2006-2008 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Implementation of a number of stream filters.""" + +try: + set +except NameError: + from sets import ImmutableSet as frozenset + from sets import Set as set +import re + +from calibre.utils.genshi.core import Attrs, QName, stripentities +from calibre.utils.genshi.core import END, START, TEXT, COMMENT + +__all__ = ['HTMLFormFiller', 'HTMLSanitizer'] +__docformat__ = 'restructuredtext en' + + +class HTMLFormFiller(object): + """A stream filter that can populate HTML forms from a dictionary of values. + + >>> from genshi.input import HTML + >>> html = HTML('''<form> + ... <p><input type="text" name="foo" /></p> + ... </form>''') + >>> filler = HTMLFormFiller(data={'foo': 'bar'}) + >>> print html | filler + <form> + <p><input type="text" name="foo" value="bar"/></p> + </form> + """ + # TODO: only select the first radio button, and the first select option + # (if not in a multiple-select) + # TODO: only apply to elements in the XHTML namespace (or no namespace)? + + def __init__(self, name=None, id=None, data=None): + """Create the filter. + + :param name: The name of the form that should be populated. If this + parameter is given, only forms where the ``name`` attribute + value matches the parameter are processed. + :param id: The ID of the form that should be populated. If this + parameter is given, only forms where the ``id`` attribute + value matches the parameter are processed. + :param data: The dictionary of form values, where the keys are the names + of the form fields, and the values are the values to fill + in. + """ + self.name = name + self.id = id + if data is None: + data = {} + self.data = data + + def __call__(self, stream): + """Apply the filter to the given stream. + + :param stream: the markup event stream to filter + """ + in_form = in_select = in_option = in_textarea = False + select_value = option_value = textarea_value = None + option_start = None + option_text = [] + no_option_value = False + + for kind, data, pos in stream: + + if kind is START: + tag, attrs = data + tagname = tag.localname + + if tagname == 'form' and ( + self.name and attrs.get('name') == self.name or + self.id and attrs.get('id') == self.id or + not (self.id or self.name)): + in_form = True + + elif in_form: + if tagname == 'input': + type = attrs.get('type') + if type in ('checkbox', 'radio'): + name = attrs.get('name') + if name and name in self.data: + value = self.data[name] + declval = attrs.get('value') + checked = False + if isinstance(value, (list, tuple)): + if declval: + checked = declval in [unicode(v) for v + in value] + else: + checked = bool(filter(None, value)) + else: + if declval: + checked = declval == unicode(value) + elif type == 'checkbox': + checked = bool(value) + if checked: + attrs |= [(QName('checked'), 'checked')] + elif 'checked' in attrs: + attrs -= 'checked' + elif type in (None, 'hidden', 'text'): + name = attrs.get('name') + if name and name in self.data: + value = self.data[name] + if isinstance(value, (list, tuple)): + value = value[0] + if value is not None: + attrs |= [(QName('value'), unicode(value))] + elif tagname == 'select': + name = attrs.get('name') + if name in self.data: + select_value = self.data[name] + in_select = True + elif tagname == 'textarea': + name = attrs.get('name') + if name in self.data: + textarea_value = self.data.get(name) + if isinstance(textarea_value, (list, tuple)): + textarea_value = textarea_value[0] + in_textarea = True + elif in_select and tagname == 'option': + option_start = kind, data, pos + option_value = attrs.get('value') + if option_value is None: + no_option_value = True + option_value = '' + in_option = True + continue + yield kind, (tag, attrs), pos + + elif in_form and kind is TEXT: + if in_select and in_option: + if no_option_value: + option_value += data + option_text.append((kind, data, pos)) + continue + elif in_textarea: + continue + yield kind, data, pos + + elif in_form and kind is END: + tagname = data.localname + if tagname == 'form': + in_form = False + elif tagname == 'select': + in_select = False + select_value = None + elif in_select and tagname == 'option': + if isinstance(select_value, (tuple, list)): + selected = option_value in [unicode(v) for v + in select_value] + else: + selected = option_value == unicode(select_value) + okind, (tag, attrs), opos = option_start + if selected: + attrs |= [(QName('selected'), 'selected')] + elif 'selected' in attrs: + attrs -= 'selected' + yield okind, (tag, attrs), opos + if option_text: + for event in option_text: + yield event + in_option = False + no_option_value = False + option_start = option_value = None + option_text = [] + elif tagname == 'textarea': + if textarea_value: + yield TEXT, unicode(textarea_value), pos + in_textarea = False + yield kind, data, pos + + else: + yield kind, data, pos + + +class HTMLSanitizer(object): + """A filter that removes potentially dangerous HTML tags and attributes + from the stream. + + >>> from genshi import HTML + >>> html = HTML('<div><script>alert(document.cookie)</script></div>') + >>> print html | HTMLSanitizer() + <div/> + + The default set of safe tags and attributes can be modified when the filter + is instantiated. For example, to allow inline ``style`` attributes, the + following instantation would work: + + >>> html = HTML('<div style="background: #000"></div>') + >>> sanitizer = HTMLSanitizer(safe_attrs=HTMLSanitizer.SAFE_ATTRS | set(['style'])) + >>> print html | sanitizer + <div style="background: #000"/> + + Note that even in this case, the filter *does* attempt to remove dangerous + constructs from style attributes: + + >>> html = HTML('<div style="background: url(javascript:void); color: #000"></div>') + >>> print html | sanitizer + <div style="color: #000"/> + + This handles HTML entities, unicode escapes in CSS and Javascript text, as + well as a lot of other things. However, the style tag is still excluded by + default because it is very hard for such sanitizing to be completely safe, + especially considering how much error recovery current web browsers perform. + + :warn: Note that this special processing of CSS is currently only applied to + style attributes, **not** style elements. + """ + + SAFE_TAGS = frozenset(['a', 'abbr', 'acronym', 'address', 'area', 'b', + 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite', + 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', + 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map', + 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp', + 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', + 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', + 'ul', 'var']) + + SAFE_ATTRS = frozenset(['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'axis', 'bgcolor', 'border', 'cellpadding', + 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', + 'clear', 'cols', 'colspan', 'color', 'compact', 'coords', 'datetime', + 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height', + 'href', 'hreflang', 'hspace', 'id', 'ismap', 'label', 'lang', + 'longdesc', 'maxlength', 'media', 'method', 'multiple', 'name', + 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', 'rel', 'rev', + 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', + 'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', + 'type', 'usemap', 'valign', 'value', 'vspace', 'width']) + + SAFE_SCHEMES = frozenset(['file', 'ftp', 'http', 'https', 'mailto', None]) + + URI_ATTRS = frozenset(['action', 'background', 'dynsrc', 'href', 'lowsrc', + 'src']) + + def __init__(self, safe_tags=SAFE_TAGS, safe_attrs=SAFE_ATTRS, + safe_schemes=SAFE_SCHEMES, uri_attrs=URI_ATTRS): + """Create the sanitizer. + + The exact set of allowed elements and attributes can be configured. + + :param safe_tags: a set of tag names that are considered safe + :param safe_attrs: a set of attribute names that are considered safe + :param safe_schemes: a set of URI schemes that are considered safe + :param uri_attrs: a set of names of attributes that contain URIs + """ + self.safe_tags = safe_tags + "The set of tag names that are considered safe." + self.safe_attrs = safe_attrs + "The set of attribute names that are considered safe." + self.uri_attrs = uri_attrs + "The set of names of attributes that may contain URIs." + self.safe_schemes = safe_schemes + "The set of URI schemes that are considered safe." + + def __call__(self, stream): + """Apply the filter to the given stream. + + :param stream: the markup event stream to filter + """ + waiting_for = None + + for kind, data, pos in stream: + if kind is START: + if waiting_for: + continue + tag, attrs = data + if tag not in self.safe_tags: + waiting_for = tag + continue + + new_attrs = [] + for attr, value in attrs: + value = stripentities(value) + if attr not in self.safe_attrs: + continue + elif attr in self.uri_attrs: + # Don't allow URI schemes such as "javascript:" + if not self.is_safe_uri(value): + continue + elif attr == 'style': + # Remove dangerous CSS declarations from inline styles + decls = self.sanitize_css(value) + if not decls: + continue + value = '; '.join(decls) + new_attrs.append((attr, value)) + + yield kind, (tag, Attrs(new_attrs)), pos + + elif kind is END: + tag = data + if waiting_for: + if waiting_for == tag: + waiting_for = None + else: + yield kind, data, pos + + elif kind is not COMMENT: + if not waiting_for: + yield kind, data, pos + + def is_safe_uri(self, uri): + """Determine whether the given URI is to be considered safe for + inclusion in the output. + + The default implementation checks whether the scheme of the URI is in + the set of allowed URIs (`safe_schemes`). + + >>> sanitizer = HTMLSanitizer() + >>> sanitizer.is_safe_uri('http://example.org/') + True + >>> sanitizer.is_safe_uri('javascript:alert(document.cookie)') + False + + :param uri: the URI to check + :return: `True` if the URI can be considered safe, `False` otherwise + :rtype: `bool` + :since: version 0.4.3 + """ + if ':' not in uri: + return True # This is a relative URI + chars = [char for char in uri.split(':', 1)[0] if char.isalnum()] + return ''.join(chars).lower() in self.safe_schemes + + def sanitize_css(self, text): + """Remove potentially dangerous property declarations from CSS code. + + In particular, properties using the CSS ``url()`` function with a scheme + that is not considered safe are removed: + + >>> sanitizer = HTMLSanitizer() + >>> sanitizer.sanitize_css(u''' + ... background: url(javascript:alert("foo")); + ... color: #000; + ... ''') + [u'color: #000'] + + Also, the proprietary Internet Explorer function ``expression()`` is + always stripped: + + >>> sanitizer.sanitize_css(u''' + ... background: #fff; + ... color: #000; + ... width: e/**/xpression(alert("foo")); + ... ''') + [u'background: #fff', u'color: #000'] + + :param text: the CSS text; this is expected to be `unicode` and to not + contain any character or numeric references + :return: a list of declarations that are considered safe + :rtype: `list` + :since: version 0.4.3 + """ + decls = [] + text = self._strip_css_comments(self._replace_unicode_escapes(text)) + for decl in filter(None, text.split(';')): + decl = decl.strip() + if not decl: + continue + is_evil = False + if 'expression' in decl: + is_evil = True + for match in re.finditer(r'url\s*\(([^)]+)', decl): + if not self.is_safe_uri(match.group(1)): + is_evil = True + break + if not is_evil: + decls.append(decl.strip()) + return decls + + _NORMALIZE_NEWLINES = re.compile(r'\r\n').sub + _UNICODE_ESCAPE = re.compile(r'\\([0-9a-fA-F]{1,6})\s?').sub + + def _replace_unicode_escapes(self, text): + def _repl(match): + return unichr(int(match.group(1), 16)) + return self._UNICODE_ESCAPE(_repl, self._NORMALIZE_NEWLINES('\n', text)) + + _CSS_COMMENTS = re.compile(r'/\*.*?\*/').sub + + def _strip_css_comments(self, text): + return self._CSS_COMMENTS('', text) diff --git a/src/calibre/utils/genshi/filters/i18n.py b/src/calibre/utils/genshi/filters/i18n.py new file mode 100644 index 0000000000..b0d919aa21 --- /dev/null +++ b/src/calibre/utils/genshi/filters/i18n.py @@ -0,0 +1,528 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007 Edgewall Software +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://genshi.edgewall.org/wiki/License. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://genshi.edgewall.org/log/. + +"""Utilities for internationalization and localization of templates. + +:since: version 0.4 +""" + +from compiler import ast +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset +from gettext import gettext +import re + +from calibre.utils.genshi.core import Attrs, Namespace, QName, START, END, TEXT, START_NS, \ + END_NS, XML_NAMESPACE, _ensure +from calibre.utils.genshi.template.base import Template, EXPR, SUB +from calibre.utils.genshi.template.markup import MarkupTemplate, EXEC + +__all__ = ['Translator', 'extract'] +__docformat__ = 'restructuredtext en' + +I18N_NAMESPACE = Namespace('http://genshi.edgewall.org/i18n') + + +class Translator(object): + """Can extract and translate localizable strings from markup streams and + templates. + + For example, assume the followng template: + + >>> from genshi.template import MarkupTemplate + >>> + >>> tmpl = MarkupTemplate('''<html xmlns:py="http://genshi.edgewall.org/"> + ... <head> + ... <title>Example + ... + ... + ...

            Example

            + ...

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

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

            Beispiel

            +

            Hallo, Hans

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

            Example

            + ...

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

            + ...

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

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

            Document + Title

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

            Some Title

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

            Some + Title

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

            Some + Title

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

            body

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

            Foo

            ') + >>> print html +

            Foo

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

            Foo

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


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


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


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