diff --git a/.bzrignore b/.bzrignore index 6b6450f1f9..8711782023 100644 --- a/.bzrignore +++ b/.bzrignore @@ -40,6 +40,7 @@ recipes/.gitignore recipes/README.md recipes/icon_checker.py recipes/readme_updater.py +recipes/garfield.recipe recipes/katalog_egazeciarz.recipe recipes/tv_axnscifi.recipe recipes/tv_comedycentral.recipe @@ -63,6 +64,7 @@ recipes/tv_tvppolonia.recipe recipes/tv_tvpuls.recipe recipes/tv_viasathistory.recipe recipes/icons/katalog_egazeciarz.png +recipes/icons/garfield.png recipes/icons/tv_axnscifi.png recipes/icons/tv_comedycentral.png recipes/icons/tv_discoveryscience.png diff --git a/Changelog.yaml b/Changelog.yaml index f27843ad1f..8fb8965e8d 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -20,6 +20,58 @@ # new recipes: # - title: +- version: 0.9.26 + date: 2013-04-05 + + new features: + - title: "PDF Output: Allow using templates to create arbitrary headers and footers. Look under PDF Output in the conversion dialog for this feature." + + - title: "ToC Editor: Allow generating the ToC directly from individual files inside the ebook. Useful for EPUBs that have individual chapters in single files." + tickets: [1163520] + + - title: "ToC Editor: Add buttons to indent/unindent the current entry" + + - title: "ToC Editor: Right-click menu to perform various useful actions on entries in the ToC" + + - title: "Column icons: Allow use of wide images as column icons" + + - title: "Add USB ids for the Palm Pre2 and Samsung Galaxy phone to the device drivers" + tickets: [1162293,1163115] + + bug fixes: + - title: "PDF Output: Fix generating page numbers causing links to not work." + tickets: [1162573] + + - title: "Wrong filename output in error message when 'Guide reference not found'" + tickets: [1163659] + + - title: "Get Books: Update Amazon, Barnes & Noble, Waterstones and Gutenberg store plugins for website change" + + - title: "PDF Output: Fix 1 pixel wide left and top margins on the cover page for some PDF conversions due to incorrect rounding." + tickets: [1162054] + + - title: "ToC Editor: Fix drag and drop of multiple items resulting in the dropped items being in random order sometimes." + tickets: [1161999] + + improved recipes: + - Financial Times UK + - Sing Tao Daily + - Apple Daily + - A List Apart + - Business Week + - Harpers printed edition + - Harvard Business Review + + new recipes: + - title: AM730 + author: Eddie Lau + + - title: Arret sur images + author: Francois D + + - title: Diario de Noticias + author: Jose Pinto + - version: 0.9.25 date: 2013-03-29 diff --git a/manual/conversion.rst b/manual/conversion.rst index bf451d0980..14710f3f6a 100644 --- a/manual/conversion.rst +++ b/manual/conversion.rst @@ -750,8 +750,61 @@ If this property is detected by |app|, the following custom properties are recog opf.series opf.seriesindex -In addition to this, you can specify the picture to use as the cover by naming it ``opf.cover`` (right click, Picture->Options->Name) in the ODT. If no picture with this name is found, the 'smart' method is used. -As the cover detection might result in double covers in certain output formats, the process will remove the paragraph (only if the only content is the cover!) from the document. But this works only with the named picture! +In addition to this, you can specify the picture to use as the cover by naming +it ``opf.cover`` (right click, Picture->Options->Name) in the ODT. If no +picture with this name is found, the 'smart' method is used. As the cover +detection might result in double covers in certain output formats, the process +will remove the paragraph (only if the only content is the cover!) from the +document. But this works only with the named picture! To disable cover detection you can set the custom property ``opf.nocover`` ('Yes or No' type) to Yes in advanced mode. +Converting to PDF +~~~~~~~~~~~~~~~~~~~ + +The first, most important, setting to decide on when converting to PDF is the page +size. By default, |app| uses a page size defined by the current +:guilabel:`Output profile`. So if your output profile is set to Kindle, |app| +will create a PDF with page size suitable for viewing on the small kindle +screen. However, if you view this PDF file on a computer screen, then it will +appear to have too large fonts. To create "normal" sized PDFs, use the override +page size option under :guilabel:`PDF Output` in the conversion dialog. + +You can insert arbitrary headers and footers on each page of the PDF by +specifying header and footer templates. Templates are just snippets of HTML +code that get rendered in the header and footer locations. For example, to +display page numbers centered at the bottom of every page, in green, use the following +footer template:: + +
Page _PAGENUM_
+ +|app| will automatically replace _PAGENUM_ with the current page number. You +can even put different content on even and odd pages, for example the following +header template will show the title on odd pages and the author on even pages:: + +_AUTHOR__TITLE_
+ +|app| will automatically replace _TITLE_ and _AUTHOR_ with the title and author +of the document being converted. You can also display text at the left and +right edges and change the font size, as demonstrated with this header +template:: + +_TITLE_
_AUTHOR_
_SECTION_
+ +_SECTION_ is replaced by whatever the name of the current section is. These +names are taken from the metadata Table of Contents in the document (the PDF +Outline). If the document has no table of contents then it will be replaced by +empty text. If a single PDF page has multiple sections, the first section on +the page will be used. + +.. note:: When adding headers and footers make sure you set the page top and + bottom margins to large enough values, under the Page Setup section of the + conversion dialog. + diff --git a/recipes/adventure_zone_pl.recipe b/recipes/adventure_zone_pl.recipe index 00b4a8753e..50a980dc92 100644 --- a/recipes/adventure_zone_pl.recipe +++ b/recipes/adventure_zone_pl.recipe @@ -66,4 +66,3 @@ class Adventure_zone(BasicNewsRecipe): if a.has_key('href') and 'http://' not in a['href'] and 'https://' not in a['href']: a['href']=self.index + a['href'] return soup - diff --git a/recipes/am730.recipe b/recipes/am730.recipe new file mode 100644 index 0000000000..0fac4bea51 --- /dev/null +++ b/recipes/am730.recipe @@ -0,0 +1,290 @@ +# vim:fileencoding=UTF-8 +from __future__ import unicode_literals +__license__ = 'GPL v3' +__copyright__ = '2013, Eddie Lau' +__Date__ = '' +__HiResImg__ = True + +''' +Change Log: +2013/03/30 -- first version +''' + +from calibre import (__appname__, force_unicode, strftime) +from calibre.utils.date import now as nowf +import os, datetime, re +from calibre.web.feeds.recipes import BasicNewsRecipe +from contextlib import nested +from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag +from calibre.ebooks.metadata.opf2 import OPFCreator +from calibre.ebooks.metadata.toc import TOC +from calibre.ebooks.metadata import MetaInformation +from calibre.utils.localization import canonicalize_lang + +class AppleDaily(BasicNewsRecipe): + title = u'AM730' + __author__ = 'Eddie Lau' + publisher = 'AM730' + oldest_article = 1 + max_articles_per_feed = 100 + auto_cleanup = False + language = 'zh' + encoding = 'utf-8' + auto_cleanup = False + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + description = 'http://www.am730.com.hk' + category = 'Chinese, News, Hong Kong' + masthead_url = 'http://www.am730.com.hk/images/logo.jpg' + + extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px; max-height:90%;} div[id=articleHeader] {font-size:200%; text-align:left; font-weight:bold;} photocaption {font-size:50%; margin-left:auto; margin-right:auto;}' + keep_only_tags = [dict(name='div', attrs={'id':'articleHeader'}), + dict(name='div', attrs={'class':'thecontent wordsnap'}), + dict(name='a', attrs={'class':'lightboximg'})] + remove_tags = [dict(name='img', attrs={'src':'/images/am730_article_logo.jpg'}), + dict(name='img', attrs={'src':'/images/am_endmark.gif'})] + + def get_dtlocal(self): + dt_utc = datetime.datetime.utcnow() + # convert UTC to local hk time - at HKT 6am, all news are available + return dt_utc + datetime.timedelta(8.0/24) - datetime.timedelta(6.0/24) + + def get_fetchdate(self): + if __Date__ <> '': + return __Date__ + else: + return self.get_dtlocal().strftime("%Y%m%d") + + def get_fetchformatteddate(self): + if __Date__ <> '': + return __Date__[0:4]+'-'+__Date__[4:6]+'-'+__Date__[6:8] + else: + return self.get_dtlocal().strftime("%Y-%m-%d") + + def get_fetchyear(self): + if __Date__ <> '': + return __Date__[0:4] + else: + return self.get_dtlocal().strftime("%Y") + + def get_fetchmonth(self): + if __Date__ <> '': + return __Date__[4:6] + else: + return self.get_dtlocal().strftime("%m") + + def get_fetchday(self): + if __Date__ <> '': + return __Date__[6:8] + else: + return self.get_dtlocal().strftime("%d") + + # Note: does not work with custom date given by __Date__ + def get_weekday(self): + return self.get_dtlocal().weekday() + + def populate_article_metadata(self, article, soup, first): + if first and hasattr(self, 'add_toc_thumbnail'): + picdiv = soup.find('img') + if picdiv is not None: + self.add_toc_thumbnail(article,picdiv['src']) + + def parse_index(self): + feeds = [] + soup = self.index_to_soup('http://www.am730.com.hk/') + ul = soup.find(attrs={'class':'nav-section'}) + sectionList = [] + for li in ul.findAll('li'): + a = 'http://www.am730.com.hk/' + li.find('a', href=True).get('href', False) + title = li.find('a').get('title', False).strip() + sectionList.append((title, a)) + for title, url in sectionList: + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) + return feeds + + def parse_section(self, url): + soup = self.index_to_soup(url) + items = soup.findAll(attrs={'style':'padding-bottom: 15px;'}) + current_articles = [] + for item in items: + a = item.find(attrs={'class':'t6 f14'}).find('a', href=True) + articlelink = 'http://www.am730.com.hk/' + a.get('href', True) + title = self.tag_to_string(a) + description = self.tag_to_string(item.find(attrs={'class':'t3 f14'})) + current_articles.append({'title': title, 'url': articlelink, 'description': description}) + return current_articles + + def preprocess_html(self, soup): + multia = soup.findAll('a') + for a in multia: + if not (a == None): + image = a.find('img') + if not (image == None): + if __HiResImg__: + image['src'] = image.get('src').replace('/thumbs/', '/') + caption = image.get('alt') + tag = Tag(soup, "photo", []) + tag2 = Tag(soup, "photocaption", []) + tag.insert(0, image) + if not caption == None: + tag2.insert(0, caption) + tag.insert(1, tag2) + a.replaceWith(tag) + return soup + + def create_opf(self, feeds, dir=None): + if dir is None: + dir = self.output_dir + title = self.short_title() + if self.output_profile.periodical_date_in_title: + title += strftime(self.timefmt) + mi = MetaInformation(title, [__appname__]) + mi.publisher = __appname__ + mi.author_sort = __appname__ + if self.publication_type: + mi.publication_type = 'periodical:'+self.publication_type+':'+self.short_title() + mi.timestamp = nowf() + article_titles, aseen = [], set() + for f in feeds: + for a in f: + if a.title and a.title not in aseen: + aseen.add(a.title) + article_titles.append(force_unicode(a.title, 'utf-8')) + + mi.comments = self.description + if not isinstance(mi.comments, unicode): + mi.comments = mi.comments.decode('utf-8', 'replace') + mi.comments += ('\n\n' + _('Articles in this issue: ') + '\n' + + '\n\n'.join(article_titles)) + + language = canonicalize_lang(self.language) + if language is not None: + mi.language = language + # This one affects the pub date shown in kindle title + #mi.pubdate = nowf() + # now appears to need the time field to be > 12.00noon as well + mi.pubdate = datetime.datetime(int(self.get_fetchyear()), int(self.get_fetchmonth()), int(self.get_fetchday()), 12, 30, 0) + opf_path = os.path.join(dir, 'index.opf') + ncx_path = os.path.join(dir, 'index.ncx') + + opf = OPFCreator(dir, mi) + # Add mastheadImage entry to()?(Czytaj|Zobacz) (też|także):.*?
', re.DOTALL), lambda match: ''), (re.compile(ur'Zobacz:.*?', re.DOTALL), lambda match: '')] + remove_javascript = True + no_stylesheets = True + now = datetime.datetime.now() + yesterday = now - datetime.timedelta(hours=24) + yesterday = yesterday.strftime("%d.%m.%Y %H:%M:%S") + pages_count = 4 + keep_only_tags = [dict(attrs={'class':['Block-Node Content-Article ', 'Block-Node Content-Article piano-closed']})] + remove_tags = [dict(attrs={'class':['Keywords Styled', 'twitter-share-button', 'Block-List-Related Block-List']})] + + feeds = [(u'Wszystkie', 'http://www.forbes.pl/rss')] + + '''def preprocess_html(self, soup): + self.append_page(soup, soup.body) + return soup + + + def append_page(self, soup, appendtag): + cleanup = False + nexturl = appendtag.find('a', attrs={'class':'next'}) + if nexturl: + cleanup = True + while nexturl: + soup2 = self.index_to_soup(self.index + nexturl['href']) + nexturl = soup2.find('a', attrs={'class':'next'}) + pagetext = soup2.findAll(id='article-body-wrapper') + if not pagetext: + pagetext = soup2.findAll(attrs={'class':'Article-Entry Styled'}) + for comment in pagetext.findAll(text=lambda text:isinstance(text, Comment)): + comment.extract() + pos = len(appendtag.contents) + appendtag.insert(pos, pagetext) + if cleanup: + for r in appendtag.findAll(attrs={'class':'paginator'}): + r.extract()''' diff --git a/recipes/gazeta-prawna-calibre-v1.recipe b/recipes/gazeta-prawna-calibre-v1.recipe index 293aa05b0d..f7d2c4935b 100644 --- a/recipes/gazeta-prawna-calibre-v1.recipe +++ b/recipes/gazeta-prawna-calibre-v1.recipe @@ -14,13 +14,14 @@ class gazetaprawna(BasicNewsRecipe): title = u'Gazeta Prawna' __author__ = u'Vroo' publisher = u'Infor Biznes' - oldest_article = 7 + oldest_article = 1 max_articles_per_feed = 20 no_stylesheets = True remove_javascript = True description = 'Polski dziennik gospodarczy' language = 'pl' encoding = 'utf-8' + ignore_duplicate_articles = {'title', 'url'} remove_tags_after = [ dict(name='div', attrs={'class':['data-art']}) @@ -30,7 +31,7 @@ class gazetaprawna(BasicNewsRecipe): ] feeds = [ - (u'Wiadomo\u015bci - najwa\u017cniejsze', u'http://www.gazetaprawna.pl/wiadomosci/najwazniejsze/rss.xml'), + (u'Z ostatniej chwili', u'http://rss.gazetaprawna.pl/GazetaPrawna'), (u'Biznes i prawo gospodarcze', u'http://biznes.gazetaprawna.pl/rss.xml'), (u'Prawo i wymiar sprawiedliwo\u015bci', u'http://prawo.gazetaprawna.pl/rss.xml'), (u'Praca i ubezpieczenia', u'http://praca.gazetaprawna.pl/rss.xml'), @@ -51,3 +52,8 @@ class gazetaprawna(BasicNewsRecipe): url = url.replace('prawo.gazetaprawna', 'www.gazetaprawna') url = url.replace('praca.gazetaprawna', 'www.gazetaprawna') return url + + def get_cover_url(self): + soup = self.index_to_soup('http://www.egazety.pl/infor/e-wydanie-dziennik-gazeta-prawna.html') + self.cover_url = soup.find('p', attrs={'class':'covr'}).a['href'] + return getattr(self, 'cover_url', self.cover_url) diff --git a/recipes/gazeta_pl_krakow.recipe b/recipes/gazeta_pl_krakow.recipe index 59b3b00933..0f7633e4b2 100644 --- a/recipes/gazeta_pl_krakow.recipe +++ b/recipes/gazeta_pl_krakow.recipe @@ -10,7 +10,7 @@ krakow.gazeta.pl from calibre.web.feeds.news import BasicNewsRecipe class gw_krakow(BasicNewsRecipe): - title = u'Gazeta.pl Kraków' + title = u'Gazeta Wyborcza Kraków' __author__ = 'teepel_PAGENUM_
' self.header = opts.pdf_header_template + if self.header: + self.header = self.header.strip() min_margin = 36 if self.footer and opts.margin_bottom < min_margin: self.log.warn('Bottom margin is too small for footer, increasing it.') @@ -192,6 +209,8 @@ class PDFWriter(QObject): self.doc.set_metadata(title=pdf_metadata.title, author=pdf_metadata.author, tags=pdf_metadata.tags) + self.doc_title = pdf_metadata.title + self.doc_author = pdf_metadata.author self.painter.save() try: if self.cover_data is not None: @@ -273,13 +292,34 @@ class PDFWriter(QObject): self.loop.processEvents(self.loop.ExcludeUserInputEvents) evaljs('document.getElementById("MathJax_Message").style.display="none";') + def get_sections(self, anchor_map): + sections = {} + ci = os.path.abspath(os.path.normcase(self.current_item)) + if self.toc is not None: + for toc in self.toc.flat(): + path = toc.abspath or None + frag = toc.fragment or None + if path is None: + continue + path = os.path.abspath(os.path.normcase(path)) + if path == ci: + col = 0 + if frag and frag in anchor_map: + col = anchor_map[frag]['column'] + if col not in sections: + sections[col] = toc.text or _('Untitled') + + return sections + def do_paged_render(self): if self.paged_js is None: + import uuid from calibre.utils.resources import compiled_coffeescript as cc self.paged_js = cc('ebooks.oeb.display.utils') self.paged_js += cc('ebooks.oeb.display.indexing') self.paged_js += cc('ebooks.oeb.display.paged') self.paged_js += cc('ebooks.oeb.display.mathjax') + self.hf_uuid = str(uuid.uuid4()).replace('-', '') self.view.page().mainFrame().addToJavaScriptWindowObject("py_bridge", self) self.view.page().longjs_counter = 0 @@ -302,6 +342,12 @@ class PDFWriter(QObject): py_bridge.value = book_indexing.all_links_and_anchors(); '''%(self.margin_top, 0, self.margin_bottom)) + amap = self.bridge_value + if not isinstance(amap, dict): + amap = {'links':[], 'anchors':{}} # Some javascript error occurred + sections = self.get_sections(amap['anchors']) + col = 0 + if self.header: self.bridge_value = self.header evaljs('paged_display.header_template = py_bridge.value') @@ -309,15 +355,14 @@ class PDFWriter(QObject): self.bridge_value = self.footer evaljs('paged_display.footer_template = py_bridge.value') if self.header or self.footer: - evaljs('paged_display.create_header_footer();') + evaljs('paged_display.create_header_footer("%s");'%self.hf_uuid) - amap = self.bridge_value - if not isinstance(amap, dict): - amap = {'links':[], 'anchors':{}} # Some javascript error occurred start_page = self.current_page_num mf = self.view.page().mainFrame() while True: + if col in sections: + self.current_section = sections[col] self.doc.init_page() if self.header or self.footer: evaljs('paged_display.update_header_footer(%d)'%self.current_page_num) @@ -331,8 +376,10 @@ class PDFWriter(QObject): evaljs('window.scrollTo(%d, 0); paged_display.position_header_footer();'%nsl[0]) if self.doc.errors_occurred: break + col += 1 if not self.doc.errors_occurred: self.doc.add_links(self.current_item, start_page, amap['links'], amap['anchors']) + diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index fb3efd36c0..7bdcb18644 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -347,9 +347,9 @@ class DeleteAction(InterfaceAction): self.remove_matching_books_from_device() # The following will run if the selected books are not on a connected device. # The user has selected to delete from the library or the device and library. - if not confirm(''+_('The selected books will be ' + if not confirm('
'+_('The %d selected book(s) will be ' 'permanently deleted and the files ' - 'removed from your calibre library. Are you sure?') + 'removed from your calibre library. Are you sure?')%len(to_delete_ids) +'
', 'library_delete_books', self.gui): return next_id = view.next_id @@ -382,9 +382,9 @@ class DeleteAction(InterfaceAction): view = self.gui.card_b_view paths = view.model().paths(rows) ids = view.model().indices(rows) - if not confirm(''+_('The selected books will be ' + if not confirm('
'+_('The %d selected book(s) will be ' 'permanently deleted ' - 'from your device. Are you sure?') + 'from your device. Are you sure?')%len(paths) +'
', 'device_delete_books', self.gui): return job = self.gui.remove_paths(paths) diff --git a/src/calibre/gui2/convert/pdf_output.py b/src/calibre/gui2/convert/pdf_output.py index 98334d1709..889a99a66a 100644 --- a/src/calibre/gui2/convert/pdf_output.py +++ b/src/calibre/gui2/convert/pdf_output.py @@ -22,7 +22,9 @@ class PluginWidget(Widget, Ui_Form): 'override_profile_size', 'paper_size', 'custom_size', 'preserve_cover_aspect_ratio', 'pdf_serif_family', 'unit', 'pdf_sans_family', 'pdf_mono_family', 'pdf_standard_font', - 'pdf_default_font_size', 'pdf_mono_font_size', 'pdf_page_numbers']) + 'pdf_default_font_size', 'pdf_mono_font_size', 'pdf_page_numbers', + 'pdf_footer_template', 'pdf_header_template', + ]) self.db, self.book_id = db, book_id for x in get_option('paper_size').option.choices: diff --git a/src/calibre/gui2/convert/pdf_output.ui b/src/calibre/gui2/convert/pdf_output.ui index a4d184d6bc..a3cd131ba3 100644 --- a/src/calibre/gui2/convert/pdf_output.ui +++ b/src/calibre/gui2/convert/pdf_output.ui @@ -6,8 +6,8 @@Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
S'està migrant la base de dades antiga a la biblioteca de %s
To see the full log, click Show Details." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:651 msgid "Current cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:654 msgid "Searching..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:816 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:852 #, python-format msgid "Downloading covers for %s, please wait..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:847 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:883 msgid "Failed to download any covers, click \"Show details\" for details." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:889 #, python-format msgid "Could not find any covers for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:855 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:891 #, python-format -msgid "Found %(num)d covers of %(title)s. Pick the one you like best." +msgid "Found %(num)d possible covers for %(title)s. When the download completes, the covers will be sorted by size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:944 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:981 msgid "Downloading metadata..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:1096 msgid "Downloading cover..." msgstr "" @@ -14106,10 +14177,6 @@ msgstr "" msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:146 -msgid "Large" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:146 msgid "Medium" msgstr "" @@ -16256,187 +16323,233 @@ msgstr "" msgid "The XPath expression %s is not valid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:147 msgid "You can edit existing entries in the Table of Contents by clicking them in the panel to the left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:149 msgid "Entries with a green tick next to them point to a location that has been verified to exist. Entries with a red dot are broken and may need to be fixed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:157 msgid "Create a &new entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:162 msgid "Generate ToC from &major headings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:165 msgid "Generate a Table of Contents from the major headings in the book. This will work if the book identifies its headings using HTML heading tags. Uses the
Migrating old database to ebook library in %s
Migruji starou databázi do knihovy ebooků v %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Flytter gammel database til e-bogsbibliotek i %s
Viele aktuelle, DRM- freie Veröffentlichungen sind unter \n" " verfügbar." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:23 +msgid "Duplicates found!" +msgstr "Duplikate gefunden!" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:29 msgid "" "Books with the same titles as the following already exist in calibre. Select " @@ -20027,11 +20048,23 @@ msgstr "Partition" msgid "First letter is usable only when sorting by name" msgstr "Erster Buchstabe kann nur verwendet werden beim Sortieren nach Name" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:113 msgid "Select a destination for the Table of Contents entry" msgstr "Wählen Sie ein Ziel für den Eintrag des Inhaltsverzeichnisses" +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:130 +msgid "Search for text..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:132 +msgid "Find &next" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:135 +msgid "Find &previous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:143 msgid "" "Here you can choose a destination for the Table of Contents' entry to point " "to. First choose a file from the book in the left-most panel. The file will " @@ -20042,31 +20075,56 @@ msgid "" "when you click." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:156 msgid "&Name of the ToC entry:" msgstr "&Name des Inhaltsverzeichnis-Eintrags:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:162 msgid "Currently selected destination:" msgstr "Momentan gewähltes Ziel:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:196 +msgid "No match found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:186 +#, python-format +msgid "No match found for: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:192 +#, python-format +msgid "" +"No matches for %(text)s found in the current file [%(current)s]. Do you want " +"to search in the %(which)s file [%(next)s]?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "next" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "previous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:286 msgid "File:" msgstr "Datei:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:270 msgid "Top of the file" msgstr "Anfang der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:272 #, python-format msgid "Approximately %d%% from the top" msgstr "Ungefähr %d%% vom Anfang aus" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:278 #, python-format msgid "Location: A <%s> tag inside the file" msgstr "Ort: Ein <%s>-Marker innerhalb der Datei" @@ -20108,7 +20166,7 @@ msgstr "Es wurde kein XPaths eingegeben" msgid "The XPath expression %s is not valid." msgstr "Der XPath-Ausdruck %s ist ungültig." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:146 msgid "" "You can edit existing entries in the Table of Contents by clicking them in " "the panel to the left." @@ -20116,7 +20174,7 @@ msgstr "" "Sie können vorhandene Einträge des Inhaltsverzeichnisses bearbeiten, indem " "Sie diese in der Menüleiste auf der linken Seite anklicken." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:148 msgid "" "Entries with a green tick next to them point to a location that has been " "verified to exist. Entries with a red dot are broken and may need to be " @@ -20126,15 +20184,15 @@ msgstr "" "überprüft wurde. Einträge mit einem roten Punkt sind beschädigt und müssen " "eventuell repariert werden." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:156 msgid "Create a &new entry" msgstr "Einen &neuen Eintrag erstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:161 msgid "Generate ToC from &major headings" msgstr "ToC aus &Hauptüberschriften erzeugen" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:164 msgid "" "Generate a Table of Contents from the major headings in the book. This will " "work if the book identifies its headings using HTML heading tags. Uses the " @@ -20145,11 +20203,11 @@ msgstr "" "Überschriften-Markierungen kennzeichnet. Verwendet die Markierungen
Migrating old database to ebook library in %s
Migriere alte Datenbank zu eBook Bibliothek in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Puede encontrar novedades sin DRM en Open Books." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:23 +msgid "Duplicates found!" +msgstr "¡Se han encontrado duplicados!" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:29 msgid "" "Books with the same titles as the following already exist in calibre. Select " @@ -19878,11 +19904,23 @@ msgstr "Partición" msgid "First letter is usable only when sorting by name" msgstr "La primera letra sólo puede usarse cuando se ordena por nombre" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:113 msgid "Select a destination for the Table of Contents entry" msgstr "Seleccione un destino para la entrada del Índice" +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:130 +msgid "Search for text..." +msgstr "Buscar texto..." + #: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:132 +msgid "Find &next" +msgstr "Buscar &siguiente" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:135 +msgid "Find &previous" +msgstr "Buscar &anterior" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:143 msgid "" "Here you can choose a destination for the Table of Contents' entry to point " "to. First choose a file from the book in the left-most panel. The file will " @@ -19900,31 +19938,58 @@ msgstr "" "aparecerá una línea verde gruesa que indica la ubicación exacta que se " "seleccionará cuando pulse el botón." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:156 msgid "&Name of the ToC entry:" msgstr "&Nombre de la entrada del Índice:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:162 msgid "Currently selected destination:" msgstr "Destino actualmente seleccionado:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:196 +msgid "No match found" +msgstr "No se encontró ninguna coincidencia" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:186 +#, python-format +msgid "No match found for: %s" +msgstr "No se encontró ninguna coincidencia para: %s" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:192 +#, python-format +msgid "" +"No matches for %(text)s found in the current file [%(current)s]. Do you want " +"to search in the %(which)s file [%(next)s]?" +msgstr "" +"No se encontraron coincidencias para %(text)s en el archivo actual " +"[%(current)s]. ¿Quiere buscar en el archivo %(which)s [%(next)s]?" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "next" +msgstr "siguiente" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "previous" +msgstr "anterior" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:286 msgid "File:" msgstr "Archivo:" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:270 msgid "Top of the file" msgstr "Principio del archivo" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:272 #, python-format msgid "Approximately %d%% from the top" msgstr "Aproximadamente %d%% desde el principio" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:278 #, python-format msgid "Location: A <%s> tag inside the file" msgstr "Posición: Una etiqueta <%s> dentro del archivo" @@ -19969,7 +20034,7 @@ msgstr "No se ha introducido ninguna expresión XPath" msgid "The XPath expression %s is not valid." msgstr "La expresión XPath %s no es válida." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:146 msgid "" "You can edit existing entries in the Table of Contents by clicking them in " "the panel to the left." @@ -19977,7 +20042,7 @@ msgstr "" "Puede modificar las entradas del Índice pulsando sobre ellas en el panel de " "la izquierda." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:148 msgid "" "Entries with a green tick next to them point to a location that has been " "verified to exist. Entries with a red dot are broken and may need to be " @@ -19987,15 +20052,15 @@ msgstr "" "que existen. Las entradas con un punto rojo están rotas y puede que deban " "corregirse." -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:156 msgid "Create a &new entry" msgstr "Crear una &nueva entrada" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:161 msgid "Generate ToC from &major headings" msgstr "Generar Índice a partir de los encabezamientos más &importantes" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:164 msgid "" "Generate a Table of Contents from the major headings in the book. This will " "work if the book identifies its headings using HTML heading tags. Uses the " @@ -20005,11 +20070,11 @@ msgstr "" "Esto funcionará si el libro identifica los encabezamientos con las etiquetas " "de encabezamiento HTML. Usa las etiquetas
Si usa la aplicación Stanza o Marvin en un dispositivo-i de Apple, " -"puede acceder a la biblioteca de calibre por conexión inalámbrica, " -"directamente en el dispositivo. Para poder hacer esto debe activar el " -"servidor de contenido de calibre." +"href=\"http://marvinapp.com/\">Marvin
Valores de orden de autor inconsistentes para el autor
"
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:558
msgid "Warning: Inconsistent Author Sort values for Author '{!s}':\n"
msgstr ""
-"Advertencia: Valores de orden de autor inconsistentes para el autor '{!s}':\n"
+"Advertencia: Valores de orden de autor inconsistentes para el autor «{!s}»:\n"
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:743
msgid "Sorting database"
@@ -22288,12 +22365,13 @@ msgid ""
"No books to catalog.\n"
"Check 'Excluded books' rules in E-book options.\n"
msgstr ""
-"No hay libros para incluir en el catálog\n"
-"Compruebe las reglas «Libros excluidos» en las opciones de libro digital.\n"
+"No hay libros para catalogar\n"
+"Compruebe las reglas «Libros excluidos» en las opciones de libro "
+"electrónico.\n"
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:859
msgid "No books available to include in catalog"
-msgstr "No hay libros disponibles para meter en el catálogo."
+msgstr "No hay libros disponibles para incluir en el catálogo."
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:2058
msgid "Genres HTML"
@@ -22385,7 +22463,7 @@ msgstr "Generando OPF"
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:4355
msgid "Thumbnails"
-msgstr "Miniaturas"
+msgstr "Miniaturas de portadas"
#: /home/kovid/work/calibre/src/calibre/library/catalogs/epub_mobi_builder.py:4361
msgid "Thumbnail"
@@ -22421,11 +22499,11 @@ msgstr "Formatos de libro adicionales"
#: /home/kovid/work/calibre/src/calibre/library/check_library.py:32
msgid "Unknown files in books"
-msgstr "Archivos desconocidos"
+msgstr "Archivos desconocidos en libros"
#: /home/kovid/work/calibre/src/calibre/library/check_library.py:33
msgid "Missing covers files"
-msgstr "Portadas inexistentes"
+msgstr "Archivos de portada inexistentes"
#: /home/kovid/work/calibre/src/calibre/library/check_library.py:34
msgid "Cover files not in database"
@@ -22489,7 +22567,7 @@ msgid ""
"Available fields: %s\n"
"Default: %%default"
msgstr ""
-"Campos por los que ordenar el resultado.\n"
+"El campo por el que se ordenan los resultados.\n"
"Campos disponibles: %s\n"
"Valor predeterminado: %%default"
@@ -22508,7 +22586,7 @@ msgstr ""
"el Manual de usuario. De manera predeterminada no se realiza el filtrado."
#: /home/kovid/work/calibre/src/calibre/library/cli.py:169
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1250
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1261
msgid ""
"The maximum width of a single line in the output. Defaults to detecting "
"screen size."
@@ -22542,8 +22620,8 @@ msgid ""
"The following books were not added as they already exist in the database "
"(see --duplicates option):"
msgstr ""
-"Los siguientes libros no se han añadido puesto que ya existen en la base de "
-"datos (vér la opción --duplicates)"
+"Los siguientes libros no se han añadido porque ya existen en la base de "
+"datos (ver la opción --duplicates)"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:305
#: /home/kovid/work/calibre/src/calibre/library/cli.py:362
@@ -22595,7 +22673,7 @@ msgstr "Establece el título de los libros añadidos"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:331
msgid "Set the authors of the added book(s)"
-msgstr "Establece el autor de los librs añadidos"
+msgstr "Establece el autor de los libros añadidos"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:333
msgid "Set the ISBN of the added book(s)"
@@ -22760,7 +22838,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:570
msgid "Field name"
-msgstr "Nombre de campo"
+msgstr "Nombre del campo"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:586
msgid "You must specify a record id as the first argument"
@@ -22770,17 +22848,23 @@ msgstr "Debe especificar un ID de registro como primer argumento"
msgid "You must specify either a field or an opf file"
msgstr "Debe especificar un campo o un archivo opf"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:599
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:596
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:877
+#, python-format
+msgid "No book with id: %s in the database"
+msgstr "No hay ningún libro con ID: %s en la base de datos"
+
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:602
#, python-format
msgid "The OPF file %s does not exist"
msgstr "El archivo OPF %s no existe"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:609
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:612
#, python-format
msgid "%s is not a known field"
msgstr "%s no es un campo conocido"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:639
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:642
msgid ""
"%prog export [options] ids\n"
"\n"
@@ -22799,31 +22883,30 @@ msgstr ""
"y metadatos (en un archivo OPF). Se pueden obtener los números ID con la "
"orden «list».\n"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:647
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:650
msgid "Export all books in database, ignoring the list of ids."
msgstr ""
-"Exportar todos los libros de la base de datos, haciendo caso omiso de la "
-"lista de identificaciones."
+"Exportar todos los libros de la base de datos, ignorando el listado de ID."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:649
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:652
msgid "Export books to the specified directory. Default is"
msgstr ""
"Exportar los libros al directorio especificado. El valor predeterminado es"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:651
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:654
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:658
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:661
msgid "Specifying this switch will turn this behavior off."
-msgstr "Si se especifica esta opción se desactiva este comportamiento"
+msgstr "Si se especifica esta opción, se desactiva este comportamiento."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:681
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:684
#, python-format
msgid "You must specify some ids or the %s option"
msgstr "Debe especificar algún ID o la opción %s"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:694
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:697
msgid ""
"%prog add_custom_column [options] label name datatype\n"
"\n"
@@ -22839,7 +22922,7 @@ msgstr ""
"columna. No debe contener espacios ni dos puntos. «nombre» es el nombre "
"visible de la columna. «tipo_de_dato» es uno de: {0}\n"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:703
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:706
msgid ""
"This column stores tag like data (i.e. multiple comma separated values). "
"Only applies if datatype is text."
@@ -22847,7 +22930,7 @@ msgstr ""
"Esta columna almacena datos de etiquetas (valores separados por comas). Sólo "
"se aplica si el tipo de dato es texto."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:707
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:710
msgid ""
"A dictionary of options to customize how the data in this column will be "
"interpreted. This is a JSON string. For enumeration columns, use --"
@@ -22885,11 +22968,11 @@ msgstr ""
"texto en formato JSON para la variable «display» de la nueva columna en el "
"archivo OPF."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:736
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:739
msgid "You must specify label, name and datatype"
msgstr "Debe especificar una etiqueta, nombre y tipo de dato"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:799
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:802
msgid ""
"\n"
" %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n"
@@ -22908,7 +22991,7 @@ msgstr ""
"catálogo generado.\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:812
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:815
msgid ""
"Comma-separated list of database IDs to catalog.\n"
"If declared, --search is ignored.\n"
@@ -22919,7 +23002,7 @@ msgstr ""
"Si se declara, no se usará --search.\n"
"Valor predeterminado: todos"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:816
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:819
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.\n"
@@ -22929,16 +23012,16 @@ msgstr ""
"véase la documentación relativa a búsquedas en el Manual de usuario.\n"
"Valor predeterminado: sin filtrado"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:822
-#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:598
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:825
+#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:601
msgid "Show detailed output information. Useful for debugging"
msgstr "Mostrar información de salida detallada. Útil para la depuración"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "Error: You must specify a catalog output file"
msgstr "Error: Debe especificar un archivo de salida para el catálogo"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:885
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:891
msgid ""
"\n"
" %prog set_custom [options] column id value\n"
@@ -22959,19 +23042,19 @@ msgstr ""
"orden «custom_columns».\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:895
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:901
msgid ""
"If the column stores multiple values, append the specified values to the "
"existing ones, instead of replacing them."
msgstr ""
-"Si la columna almacena valores múltiples, añadir los valores especificados a "
+"Si la columna almacena valores múltiples, agrega los valores especificados a "
"los existentes en lugar de reemplazarlos."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:906
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:912
msgid "Error: You must specify a field name, id and value"
-msgstr "Error: Debe especificar un nombre de campo, identificador y valor"
+msgstr "Error: Debe especificar un nombre de campo, ID y valor"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:926
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:932
msgid ""
"\n"
" %prog custom_columns [options]\n"
@@ -22983,23 +23066,33 @@ msgstr ""
" %prog custom_columns [opciones]\n"
"\n"
" Da una lista de las columnas personalizadas disponibles. Muestra las "
-"etiquetas de columna e identificadores.\n"
+"etiquetas de columna e ID.\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:932
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:938
msgid "Show details for each column."
-msgstr "Mostrar detalles de las columnas"
+msgstr "Mostrar detalles de cada columna."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:944
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:950
#, python-format
-msgid "You will lose all data in the column: %r. Are you sure (y/n)? "
-msgstr "Se perderán todos los datos de la columna: %r. Está seguro (s/n)? "
+msgid "You will lose all data in the column: %s. Are you sure (y/n)? "
+msgstr "Se perderán todos los datos de la columna: %s. ¿Está seguro (s/n)? "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:946
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:952
msgid "y"
msgstr "s"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:953
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:957
+#, python-format
+msgid ""
+"No column named %s found. You must use column labels, not titles. Use "
+"calibredb custom_columns to get a list of labels."
+msgstr ""
+"No se encontró ninguna columna denominada %s. Debe usar las etiquetas de "
+"columna, no los títulos. Use «calibredb custom_columns» para obtener una "
+"lista de etiquetas."
+
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:964
msgid ""
"\n"
" %prog remove_custom_column [options] label\n"
@@ -23015,15 +23108,15 @@ msgstr ""
" las columnas disponibles con la orden «custom_columns».\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:960
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:971
msgid "Do not ask for confirmation"
msgstr "No pedir confirmación"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:970
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:981
msgid "Error: You must specify a column label"
msgstr "Error: Debe especificar una etiqueta para la columna"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:981
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:992
msgid ""
"\n"
" %prog saved_searches [options] list\n"
@@ -23045,41 +23138,41 @@ msgstr ""
" reemplazada.\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:998
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1009
msgid "Error: You must specify an action (add|remove|list)"
msgstr "Error: Debe especificar una acción (add|remove|list)"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1006
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1017
msgid "Name:"
msgstr "Nombre:"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1007
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1018
msgid "Search string:"
msgstr "Texto de búsqueda:"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1013
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024
msgid "Error: You must specify a name and a search string"
msgstr "Error: Debe especificar un nombre y el texto de búsqueda"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1016
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1027
msgid "added"
msgstr "añadido"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1021
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032
msgid "Error: You must specify a name"
msgstr "Error: Debe especificar un nombre"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035
msgid "removed"
msgstr "eliminada"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1028
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039
#, python-format
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr ""
"Error: La acción %s no se reconoce, debe ser una de: (add|remove|list)"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046
msgid ""
"%prog backup_metadata [options]\n"
"\n"
@@ -23103,7 +23196,7 @@ msgstr ""
"Tenga en cuenta que normalmente no hay necesidad de hacer esto, pues\n"
"los ficheros OPF se actualizan cada vez que se modifican los metadatos.\n"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1057
msgid ""
"Normally, this command only operates on books that have out of date OPF "
"files. This option makes it operate on all books."
@@ -23111,7 +23204,7 @@ msgstr ""
"Normalmente, esta orden sólo actúa sobre libros que tienen ficheros OPF "
"desactualizados. Esta opción hace que actúe sobre todos los libros."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1085
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1096
msgid ""
"%prog check_library [options]\n"
"\n"
@@ -23123,12 +23216,12 @@ msgstr ""
"Realiza algunas comprobaciones en el sistema de archivos que contiene la "
"biblioteca. El resultado es {0}\n"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1092
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1242
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1103
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1253
msgid "Output in CSV"
-msgstr "Salida en CSV"
+msgstr "Salida a formato CSV"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1095
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1106
msgid ""
"Comma-separated list of reports.\n"
"Default: all"
@@ -23136,27 +23229,27 @@ msgstr ""
"Lista de resultados separados por comas\n"
"Valor predeterminado: all"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1099
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1110
msgid ""
"Comma-separated list of extensions to ignore.\n"
"Default: all"
msgstr ""
-"Lista de extensiones para ignorar separadas por comas.\n"
+"Lista de extensiones que se ignorarán separadas por comas.\n"
"Valor predeterminado: all"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1103
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1114
msgid ""
"Comma-separated list of names to ignore.\n"
"Default: all"
msgstr ""
-"Lista de nombres para ignorar separados por comas.\n"
+"Lista de nombres que se ignorarán separados por comas.\n"
"Valor predeterminado: all"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1133
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1144
msgid "Unknown report check"
-msgstr "Resultado desconocido"
+msgstr "Informe de verificación desconocido"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1167
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1178
msgid ""
"%prog restore_database [options]\n"
"\n"
@@ -23184,7 +23277,7 @@ msgstr ""
"recuperados serán tan precisos como lo sean los archivos OPF.\n"
" "
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1181
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1192
msgid ""
"Really do the recovery. The command will not run unless this option is "
"specified."
@@ -23192,12 +23285,12 @@ msgstr ""
"Llevar a cabo la recuperación. La orden no se ejecutará a menos que se "
"especifique esta opción."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1194
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1205
#, python-format
msgid "You must provide the %s option to do a recovery"
msgstr "Debe proporcionar la opción %s para hacer una recuperación"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1231
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1242
msgid ""
"%prog list_categories [options]\n"
"\n"
@@ -23209,15 +23302,15 @@ msgstr ""
"Genera un informe de la información de la categoría en la base de datos. La\n"
"información es el equivalente a lo que se muestra en el panel de etiquetas.\n"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1239
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1250
msgid ""
"Output only the number of items in a category instead of the counts per item "
"within the category"
msgstr ""
-"Generar en la salida sólo el número de elementos en una categoría en vez de "
-"cuántas veces aparece por elemento en la categoría"
+"Generar en la salida sólo el número de elementos en una categoría en lugar "
+"de las veces que aparece por elemento en la categoría"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1244
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1255
msgid ""
"The character to put around the category value in CSV mode. Default is "
"quotes (\")."
@@ -23225,25 +23318,25 @@ msgstr ""
"El carácter que se pondrá alrededor del valor de la categoría en modo CSV. "
"El valor predeterminado son las comillas ('')."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1247
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1258
msgid ""
"Comma-separated list of category lookup names.\n"
"Default: all"
msgstr ""
-"Lista de los nombres de las categorías a buscar, separados por comas.\n"
+"Lista de los nombres de búsqueda de las categorías, separados por comas.\n"
"Valor predeterminado: todas"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1253
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1264
msgid "The string used to separate fields in CSV mode. Default is a comma."
msgstr ""
"El texto que se usará para separar los campos en el modo CSV. El valor "
"predeterminado es una coma."
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1291
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1302
msgid "CATEGORY ITEMS"
msgstr "ELEMENTOS DE CATEGORÍAS"
-#: /home/kovid/work/calibre/src/calibre/library/cli.py:1364
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:1375
#, python-format
msgid ""
"%%prog command [options] [arguments]\n"
@@ -23279,7 +23372,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:187
msgid "restored preference "
-msgstr "restaurada preferencia "
+msgstr "preferencia restaurada "
#: /home/kovid/work/calibre/src/calibre/library/database2.py:192
#: /home/kovid/work/calibre/src/calibre/library/restore.py:234
@@ -23291,19 +23384,19 @@ msgstr "creando columna personalizada "
msgid " (%s books)"
msgstr " (%s libros)"
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3669
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3685
#, python-format
msgid "
Migrating old database to ebook library in %s
Migrando la base de datos antigua a la biblioteca de libros electrónicos "
"en %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrazioa egiten datu base zaharretik liburu elektronikoen liburutegira "
"zera honetan: %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Migre l’ancienne base vers la bibliothèque dans %s
Migrating old database to ebook library in %s
Migrating old database to ebook library in %s
Pode atopar novidades sen DRM en Open Books." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:23 +msgid "Duplicates found!" +msgstr "Atopáronse duplicados!" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:29 msgid "" "Books with the same titles as the following already exist in calibre. Select " @@ -18799,11 +18820,23 @@ msgstr "" msgid "First letter is usable only when sorting by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:113 msgid "Select a destination for the Table of Contents entry" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:130 +msgid "Search for text..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:132 +msgid "Find &next" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:135 +msgid "Find &previous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:143 msgid "" "Here you can choose a destination for the Table of Contents' entry to point " "to. First choose a file from the book in the left-most panel. The file will " @@ -18814,31 +18847,56 @@ msgid "" "when you click." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:156 msgid "&Name of the ToC entry:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:162 msgid "Currently selected destination:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:196 +msgid "No match found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:186 +#, python-format +msgid "No match found for: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:192 +#, python-format +msgid "" +"No matches for %(text)s found in the current file [%(current)s]. Do you want " +"to search in the %(which)s file [%(next)s]?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "next" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:195 +msgid "previous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:286 msgid "File:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:270 msgid "Top of the file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:272 #, python-format msgid "Approximately %d%% from the top" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/location.py:278 #, python-format msgid "Location: A <%s> tag inside the file" msgstr "" @@ -18880,65 +18938,73 @@ msgstr "" msgid "The XPath expression %s is not valid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:146 msgid "" "You can edit existing entries in the Table of Contents by clicking them in " "the panel to the left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:148 msgid "" "Entries with a green tick next to them point to a location that has been " "verified to exist. Entries with a red dot are broken and may need to be " "fixed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:156 msgid "Create a &new entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:161 msgid "Generate ToC from &major headings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/toc/main.py:164 msgid "" "Generate a Table of Contents from the major headings in the book. This will " "work if the book identifies its headings using HTML heading tags. Uses the " "
Migrating old database to ebook library in %s
Migrando a base de datos antiga á biblioteca de libros electrónicos en "
"%s