diff --git a/Changelog.yaml b/Changelog.yaml index 3e4812cb6b..1e3d4905b1 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,99 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.20 + date: 2010-09-24 + + + new features: + - title: "Tweak epub feature." + type: major + description: > + "Now you can conveniently browse the contents of an epub, tweak them and rebuild the epub within your calibre library + by right clicking on the book and selecting Tweak ePub. See http://www.mobileread.com/forums/showthread.php?t=99875 + for details." + + - title: "Add button to Edit metadata dialog to trim borders from the cover" + + - title: "Kobo driver: Add support for setting the ReadStatus to Read and correctly deal with empty collections" + + - title: "Improved algorithm for removal of hyphens during pre-processing" + + - title: "EPUB metadata: Don't read timestamp value from epubs as I am sick of closing bugs about adding books and having the Date not be today." + + - title: "After bulk edit metadata, reselect previously selected books." + + bug fixes: + - title: "Fix regression in 0.7.19 that broke the By Author and By Title category listing in Stanza/Aldiko feeds." + + - title: "MOBI Output: Fix regression that broke sections list in downloaded periodicals on Kindle for non-english news sources" + + - title: "News download: Rationalize cover processing." + tickets: [6852] + + - title: "Cover cache: load images only in the GUI thread to prevent stale files being leftover by set_path due to Windows file locking" + + - title: "Database: Make renaming of folders on case change more robust" + tickets: [6914] + + - title: "When adding/replacing files to/in EPUB files, set the GPF bit for all files in the archive, to prevent unzip from complaining in linux" + tickets: [6363] + + - title: "Plugin loading: Handle encoding declarations in .py files correctly" + + - title: "MOBI input: Another corner case" + tickets: [6909] + + - title: "IPC: Store results file in the calibre temp dir and also dont die if for some reason removing result file fails. Should make adding/saving more robust" + + - title: "Database: Fix regression that caused has_cover to create empty directories unneccessarily" + + - title: "Detection of Alex on unix" + tickets: [5900] + + - title: "News download: Don't add inline table of contents when downloading news for the Kindle" + + - title: "Add prologue and epilogue to default chapter detection regex" + + - title: "Kobo driver: Fix issue where books that are read were getting their status reset to Unread" + + - title: "Device drivers: Fix occassional false positive when matching books on device with books in the calibre library" + + - title: "Content server: Making serving of large files more efficient." + + - title: "GUI device detection: Handle case when user yanks connected device before device connection handler is called." + tickets: [6864] + + - title: "Strip leading/trailing whitespace when setting metadata using the edit metadata dialog" + tickets: [6854] + + - title: "KOBO: Editing the Im_Reading list with SD Card installed fixed" + tickets: [6850] + + new recipes: + - title: "Neal's Nuze and Popular Science" + author: Tony Stegall + + - title: "Rmf24.pl" + author: "Tomasz Dlugosz" + + - title: "Gazeta Pomorska" + author: "Richard" + + - title: "Le Journal de Montreal and superesportes" + author: "Luciano Furtado" + + - title: "The Marker" + author: Marbs + + - title: "Tagesanzeiger" + author: noxxx + + + improved recipes: + - Danas + - Harvard Business Review + - version: 0.7.19 date: 2010-09-17 @@ -61,6 +154,7 @@ - title: "PDB Input: Fix bug in conversion of TOC in some PML files" + new recipes: - title: "taz.de RSS" author: Alexander Schremmer @@ -272,7 +366,7 @@ new features: - title: "Multiple library support: Various improvements to make using multiple calibre libraries easier." type: major - desc: > + description: > "Now, when you switch libraries using the Choose Library button on the toolbar, entries are created in the menu of that button to easily switch to that library in the future. Also, you can now right click on a book in the calibre library and use the 'Copy to library' action to copy the book to another library, that you have switched to at least once. The name of the current library is shown in the titlebar. @@ -280,7 +374,7 @@ - title: "Content server: Allow setting a restriction so that the server shares only some of the books in the library." type: major - desc: > + description: > "You can now use a Saved Search as a restiction for the content server, via Preferences->Content Server. This will cause the server to share only those books that match the saved search. " diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index 86cd04289b..f5bf478e0c 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -54,7 +54,7 @@ function render_book(book) { formats = book.attr("formats").split(","); if (formats.length > 0) { for (i=0; i < formats.length; i++) { - title += ''+formats[i]+', '; + title += ''+formats[i]+', '; } title = title.slice(0, title.length-2); title += ' ({0} MB) '.format(size); diff --git a/resources/images/news/howtogeek.png b/resources/images/news/howtogeek.png new file mode 100644 index 0000000000..236ac79df6 Binary files /dev/null and b/resources/images/news/howtogeek.png differ diff --git a/resources/images/news/jpost_fr.png b/resources/images/news/jpost_fr.png new file mode 100644 index 0000000000..f68746e2e4 Binary files /dev/null and b/resources/images/news/jpost_fr.png differ diff --git a/resources/recipes/boortz.recipe b/resources/recipes/boortz.recipe index a3b0f5fffe..0b52e0b9ca 100644 --- a/resources/recipes/boortz.recipe +++ b/resources/recipes/boortz.recipe @@ -1,4 +1,5 @@ from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup, re class AdvancedUserRecipe1282101454(BasicNewsRecipe): title = 'Nealz Nuze' language = 'en' @@ -6,16 +7,16 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): description = 'Neal Boortz Show Radio Notes' publisher = 'Neal Boortz' category = 'news, politics, USA, talkshow' - oldest_article = 1 + oldest_article = 2 max_articles_per_feed = 100 linearize_tables = True no_stylesheets = True remove_javascript = True - + masthead_url = 'http://boortz.com/images/nuze_logo.gif' keep_only_tags = [ - dict(name='div', attrs={'id':['SiteContent']}) - #,dict(attrs={'id':['cxArticleText']}) + dict(name='td', attrs={'id':['contentWellCell']}) + ] remove_tags = [ dict(name='a', attrs={'class':['blogPermalink']}), @@ -25,13 +26,13 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): remove_tags_after = [dict(name='div', attrs={'class':'blogEntryBody'}),] feeds = [ ('NUZE', 'http://boortz.com/nealz_nuze_rss/rss.xml') - + ] - - - - + + + + diff --git a/resources/recipes/howtogeek.recipe b/resources/recipes/howtogeek.recipe new file mode 100644 index 0000000000..575600a77b --- /dev/null +++ b/resources/recipes/howtogeek.recipe @@ -0,0 +1,40 @@ +from calibre.web.feeds.news import BasicNewsRecipe +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'How To Geek' + language = 'en' + __author__ = 'TonytheBookworm' + description = 'Daily Computer Tips and Tricks' + publisher = 'Howtogeek' + category = 'PC,tips,tricks' + oldest_article = 2 + max_articles_per_feed = 100 + linearize_tables = True + no_stylesheets = True + remove_javascript = True + masthead_url = 'http://blog.stackoverflow.com/wp-content/uploads/how-to-geek-logo.png' + + + + remove_tags =[dict(name='a', attrs={'target':['_blank']}), + dict(name='table', attrs={'id':['articleTable']}), + dict(name='div', attrs={'class':['feedflare']}), + ] + + feeds = [ + ('Tips', 'http://feeds.howtogeek.com/howtogeek') + + ] + + + + + + + + + + + + + + diff --git a/resources/recipes/jpost_fr.recipe b/resources/recipes/jpost_fr.recipe new file mode 100644 index 0000000000..c4af992c43 --- /dev/null +++ b/resources/recipes/jpost_fr.recipe @@ -0,0 +1,57 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class JerusalemPost(BasicNewsRecipe): + title = 'Jerusalem post' + language = 'fr' + __author__ = 'TonytheBookworm' + description = 'The Jerusalem Post (in French)' + publisher = 'jpost' + category = 'news' + oldest_article = 30 + max_articles_per_feed = 100 + linearize_tables = True + no_stylesheets = True + remove_javascript = True + + masthead_url = 'http://static.jpost.com/JPSITES/images/JFrench/2008/site/jplogo.JFrench.gif' + + remove_tags = [ + dict(name='a', attrs={'href':['javascript:window.print()']}), + dict(name='div', attrs={'class':['bot']}), + + ] + + feeds = [ + ('NEWS', 'http://fr.jpost.com/servlet/Satellite?collId=1216805762036&pagename=JFrench%2FPage%2FRSS'), + ('JFrench En route vers la paix', 'http://fr.jpost.com/servlet/Satellite?collId=1216805762201&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Politique', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737334&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Securite', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737338&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Moyen Orient', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737342&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Diplomatie / Monde', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737346&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Economie / Sciences', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737358&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Societe', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737354&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Opinions', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737350&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Monde juif', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737366&pagename=JFrench%2FPage%2FRSS'), + ('JFrench Culture / Sport', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737362&pagename=JFrench%2FPage%2FRSS') + ] + def print_version(self, url): + split1 = url.split("cid=") + #for testing only ------- + #print 'SPLIT IS: ', split1 + #print 'ORG URL IS: ', url + #--------------------------- + idnum = split1[1] # get the actual value of the id article + #for testing only -------------------- + #print 'the idnum is: ', idnum + #-------------------------------------- + print_url = 'http://fr.jpost.com/servlet/Satellite?cid=' + idnum + '&pagename=JFrench%2FJPArticle%2FPrinter' + #for testing only ------------------------- + #print 'PRINT URL IS: ', print_url + #------------------------------------------ + return print_url + + #example of how links should be formated + #-------------------------------------------------------------------------------------------------------------- + #org version = http://fr.jpost.com/servlet/Satellite?pagename=JFrench/JPArticle/ShowFull&cid=1282804806075 + #print version = http://fr.jpost.com/servlet/Satellite?cid=1282804806075&pagename=JFrench%2FJPArticle%2FPrinter + #------------------------------------------------------------------------------------------------------------------ diff --git a/resources/recipes/popscience.recipe b/resources/recipes/popscience.recipe index a1ea91a6ae..2bef7e4807 100644 --- a/resources/recipes/popscience.recipe +++ b/resources/recipes/popscience.recipe @@ -1,5 +1,5 @@ -import re from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup, re class AdvancedUserRecipe1282101454(BasicNewsRecipe): title = 'Popular Science' @@ -12,38 +12,36 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): max_articles_per_feed = 100 no_stylesheets = True remove_javascript = True - + use_embedded_content = True + masthead_url = 'http://www.raytheon.com/newsroom/rtnwcm/groups/Public/documents/masthead/rtn08_popscidec_masthead.jpg' - - remove_tags = [dict(name='div', attrs={'id':['toolbar','main_supplements']}), - dict(name='span', attrs={'class':['comments']}), - dict(name='div', attrs={'class':['relatedinfo related-right','node_navigation','content2']}), - dict(name='ul', attrs={'class':['item-list clear-block']})] + + feeds = [ - + ('Gadgets', 'http://www.popsci.com/full-feed/gadgets'), ('Cars', 'http://www.popsci.com/full-feed/cars'), ('Science', 'http://www.popsci.com/full-feed/science'), ('Technology', 'http://www.popsci.com/full-feed/technology'), ('DIY', 'http://www.popsci.com/full-feed/diy'), - + ] - - #The following will get read of the Gallery: links when found - + + #The following will get read of the Gallery: links when found + def preprocess_html(self, soup) : print 'SOUP IS: ', soup weblinks = soup.findAll(['head','h2']) if weblinks is not None: for link in weblinks: if re.search('(Gallery)(:)',str(link)): - + link.parent.extract() return soup - #----------------------------------------------------------------- - - + #----------------------------------------------------------------- + + diff --git a/resources/recipes/scientific_american.recipe b/resources/recipes/scientific_american.recipe index 8896121092..2ea865517e 100644 --- a/resources/recipes/scientific_american.recipe +++ b/resources/recipes/scientific_american.recipe @@ -1,78 +1,91 @@ #!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' -__docformat__ = 'restructuredtext en' -''' -sciam.com -''' import re from calibre.web.feeds.news import BasicNewsRecipe class ScientificAmerican(BasicNewsRecipe): - title = u'Scientific American' - description = u'Popular science. Monthly magazine.' - __author__ = 'Kovid Goyal' - language = 'en' - remove_javascript = True - encoding = 'utf-8' + title = u'Scientific American' + description = u'Popular Science. Monthly magazine.' + category = 'science' + __author__ = 'Starson17' + no_stylesheets = True + use_embedded_content = False + language = 'en' + publisher = 'Nature Publishing Group' + remove_empty_feeds = True + remove_javascript = True + oldest_article = 30 + max_articles_per_feed = 100 - def print_version(self, url): - return url + '&print=true' + conversion_options = {'linearize_tables' : True + , 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [ + dict(name='h2', attrs={'class':'articleTitle'}) + ,dict(name='p', attrs={'id':'articleDek'}) + ,dict(name='p', attrs={'class':'articleInfo'}) + ,dict(name='div', attrs={'id':['articleContent']}) + ,dict(name='img', attrs={'src':re.compile(r'/media/inline/blog/Image/', re.DOTALL|re.IGNORECASE)}) + ] + + remove_tags = [dict(name='a', attrs={'class':'tinyCommentCount'})] def parse_index(self): soup = self.index_to_soup('http://www.scientificamerican.com/sciammag/') - month = self.tag_to_string(soup.find('p',attrs={'id':'articleDek'})) - self.timefmt = ' [%s]'%(' '.join(month.strip().split()[:2])) + issuetag = soup.find('p',attrs={'id':'articleDek'}) + self.timefmt = ' [%s]'%(self.tag_to_string(issuetag)) img = soup.find('img', alt='Scientific American Magazine', src=True) if img is not None: self.cover_url = img['src'] - - feeds = [] - for div in soup.findAll('div', attrs={'class':['primaryCol', - 'secondaryCol']}): - current_section = None - for tag in div.findAll(['h2', 'ul']): - if tag.name == 'h2': - current_section = self.tag_to_string(tag).strip() - self.log('\tFound section:', current_section) - elif current_section is not None and tag.name == 'ul': - articles = [] - for li in tag.findAll('li'): - t = li.findAll('a', - attrs={'class':lambda x: x != 'thumb'}, - href=lambda x: x and 'article.cfm' in x) - if not t: - continue - t = t[-1] - title = self.tag_to_string(t) - url = t['href'] - desc = '' - p = li.find(attrs={'class':'dek'}) - if p is not None: - desc = self.tag_to_string(p) - articles.append({'title':title, 'url':url, - 'description':desc, 'date':''}) - self.log('\t\tFound article:', title, '\n\t\tat', url) - if articles: - feeds.append((current_section, articles)) - current_section = None + features, feeds = [], [] + for a in soup.find(attrs={'class':'primaryCol'}).findAll('a',attrs={'title':'Feature'}): + if a is None: continue + desc = '' + s = a.parent.parent.find(attrs={'class':'dek'}) + desc = self.tag_to_string(s) + article = { + 'url' : a['href'], + 'title' : self.tag_to_string(a), + 'date' : '', + 'description' : desc, + } + features.append(article) + feeds.append(('Features', features)) + department = [] + title = None + for li in soup.find(attrs={'class':'secondaryCol'}).findAll('li'): + if 'department.cfm' in li.a['href']: + if department: + feeds.append((title, department)) + title = self.tag_to_string(li.a) + department = [] + if 'article.cfm' in li.h3.a['href']: + article = { + 'url' : li.h3.a['href'], + 'title' : self.tag_to_string(li.h3.a), + 'date': '', + 'description': self.tag_to_string(li.p), + } + department.append(article) + if department: + feeds.append((title, department)) return feeds def postprocess_html(self, soup, first_fetch): - if soup is not None: - for span in soup.findAll('span', attrs={'class':'pagination'}): - span.extract() - if not first_fetch: - div = soup.find('div', attrs={'class':'headline'}) - if div: - div.extract() - + for item in soup.findAll('a'): + if 'topic.cfm' in item['href']: + item.replaceWith(item.string) return soup - preprocess_regexps = [ - (re.compile(r'Already a Digital subscriber.*Now', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'If your institution has site license access, enter.*here.', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'to subscribe to our.*;.*\}', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'\)\(jQuery\);.*-->', re.DOTALL|re.IGNORECASE), lambda match: ''), - ] + extra_css = ''' + p{font-weight: normal; font-size:small} + li{font-weight: normal; font-size:small} + .headline p{font-size:x-small; font-family:Arial,Helvetica,sans-serif;} + h2{font-size:large; font-family:Arial,Helvetica,sans-serif;} + h3{font-size:x-small;font-family:Arial,Helvetica,sans-serif;} + ''' diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index 3b1239814a..92c2fe5954 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -389,6 +389,7 @@ class HTMLPreProcessor(object): if is_pdftohtml: end_rules.append((re.compile(r'
\s*(?P \s*(?P )?'), chap_head),)
+ length = -1
if getattr(self.extra_opts, 'unwrap_factor', 0.0) > 0.01:
length = line_length('pdf', html, getattr(self.extra_opts, 'unwrap_factor'))
if length:
@@ -425,7 +426,7 @@ class HTMLPreProcessor(object):
for rule in rules + end_rules:
html = rule[0].sub(rule[1], html)
- if is_pdftohtml:
+ if is_pdftohtml and length > -1:
# Dehyphenate
dehyphenator = Dehyphenator()
html = dehyphenator(html,'pdf', length)
diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py
index 53788809b6..6c57e30166 100644
--- a/src/calibre/gui2/dialogs/metadata_single.py
+++ b/src/calibre/gui2/dialogs/metadata_single.py
@@ -819,7 +819,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
fname = err.filename if err.filename else 'file'
return error_dialog(self, _('Permission denied'),
_('Could not open %s. Is it being used by another'
- ' program?')%fname, show=True)
+ ' program?')%fname, det_msg=traceback.format_exc(),
+ show=True)
raise
self.save_state()
QDialog.accept(self)
diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py
index aeaed9b46e..a6f3f286bc 100644
--- a/src/calibre/library/database2.py
+++ b/src/calibre/library/database2.py
@@ -870,7 +870,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
path = self.format_abspath(index, format, index_is_id=index_is_id)
if path is not None:
f = open(path, mode)
- ret = f if as_file else f.read()
+ try:
+ ret = f if as_file else f.read()
+ except IOError:
+ f.seek(0)
+ out = cStringIO.StringIO()
+ shutil.copyfileobj(f, out)
+ ret = out.getvalue()
if not as_file:
f.close()
return ret
diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py
index 041ea78051..9de748bcbe 100644
--- a/src/calibre/library/server/content.py
+++ b/src/calibre/library/server/content.py
@@ -123,8 +123,6 @@ class ContentServer(object):
return self.static('index.html')
-
-
# Actually get content from the database {{{
def get_cover(self, id, thumbnail=False):
cover = self.db.cover(id, index_is_id=True, as_file=False)
diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py
index c51de90c6d..223e5a5f2d 100644
--- a/src/calibre/library/server/mobile.py
+++ b/src/calibre/library/server/mobile.py
@@ -19,6 +19,7 @@ from calibre.ebooks.metadata import fmt_sidx
from calibre.constants import __appname__
from calibre import human_readable
from calibre.utils.date import utcfromtimestamp
+from calibre.utils.filenames import ascii_filename
def CLASS(*args, **kwargs): # class is a reserved word in Python
kwargs['class'] = ' '.join(args)
@@ -111,11 +112,13 @@ def build_index(books, num, search, sort, order, start, total, url_base, CKEYS):
data = TD()
last = None
for fmt in book['formats'].split(','):
+ a = ascii_filename(book['authors'])
+ t = ascii_filename(book['title'])
s = SPAN(
A(
fmt.lower(),
- href='/get/%s/%s-%s_%d.%s' % (fmt, book['authors'],
- book['title'], book['id'], fmt)
+ href='/get/%s/%s-%s_%d.%s' % (fmt, a, t,
+ book['id'], fmt)
),
CLASS('button'))
s.tail = u'\u202f' #
diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py
index 12fcc217f0..469d2457e7 100644
--- a/src/calibre/library/server/xml.py
+++ b/src/calibre/library/server/xml.py
@@ -16,6 +16,7 @@ from calibre.library.server.utils import strftime, format_tag_string
from calibre.ebooks.metadata import fmt_sidx
from calibre.constants import preferred_encoding
from calibre import isbytestring
+from calibre.utils.filenames import ascii_filename
E = ElementMaker()
@@ -92,6 +93,8 @@ class XMLServer(object):
y = format_tag_string(y, ',', ignore_max=True)
kwargs[x] = serialize(y) if y else ''
+ kwargs['safe_title'] = ascii_filename(kwargs['title'])
+
c = kwargs.pop('comments')
CFM = self.db.field_metadata
diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot
index c837e71acb..146a2e2e0c 100644
--- a/src/calibre/translations/calibre.pot
+++ b/src/calibre/translations/calibre.pot
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: calibre 0.7.19\n"
-"POT-Creation-Date: 2010-09-17 14:11+MDT\n"
-"PO-Revision-Date: 2010-09-17 14:11+MDT\n"
+"Project-Id-Version: calibre 0.7.20\n"
+"POT-Creation-Date: 2010-09-24 14:39+MDT\n"
+"PO-Revision-Date: 2010-09-24 14:39+MDT\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@@ -22,7 +22,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71
#: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267
@@ -103,24 +104,24 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241
-#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324
-#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:137
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:144
#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377
@@ -133,11 +134,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database.py:913
#: /home/kovid/work/calibre/src/calibre/library/database2.py:375
#: /home/kovid/work/calibre/src/calibre/library/database2.py:387
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1065
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972
#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140
@@ -243,154 +244,154 @@ msgstr ""
msgid "Set metadata from %s files"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688
msgid "Look and Feel"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724
msgid "Interface"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694
msgid "Adjust the look and feel of the calibre interface to suit your tastes"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700
msgid "Behavior"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706
msgid "Change the way calibre behaves"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176
msgid "Add your own columns"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717
msgid "Add/remove your own columns to the calibre book list"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722
msgid "Customize the toolbar"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728
msgid "Customize the toolbars and context menus, changing which actions are available in each"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734
msgid "Input Options"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758
msgid "Conversion"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740
msgid "Set conversion options specific to each input format"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745
msgid "Common Options"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751
msgid "Set conversion options common to all formats"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756
msgid "Output Options"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762
msgid "Set conversion options specific to each output format"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767
msgid "Adding books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793
msgid "Import/Export"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773
msgid "Control how calibre reads metadata from files when adding books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779
msgid "Saving books to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785
msgid "Control how calibre exports files from its database to disk when using Save to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791
msgid "Sending books to devices"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797
msgid "Control how calibre transfers files to your ebook reader"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803
msgid "Sharing books by email"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817
msgid "Sharing"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809
msgid "Setup sharing of books via email. Can be used for automatic sending of downloaded news to your devices"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815
msgid "Sharing over the net"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821
msgid "Setup the calibre Content Server which will give you access to your calibre library from anywhere, on any device, over the internet"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828
msgid "Plugins"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853
msgid "Advanced"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834
msgid "Add/remove/customize various bits of calibre functionality"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840
msgid "Tweaks"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846
msgid "Fine tune how calibre behaves in various contexts"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851
msgid "Miscellaneous"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857
msgid "Miscellaneous advanced configuration"
msgstr ""
@@ -539,15 +540,15 @@ msgstr ""
msgid "Enabled plugins"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93
msgid "No valid plugin found in "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508
msgid "Initialization of plugin %s failed with traceback:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541
msgid ""
" %prog options\n"
"\n"
@@ -555,27 +556,27 @@ msgid ""
" "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547
msgid "Add a plugin by specifying the path to the zip file containing it."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549
msgid "Remove a custom plugin by name. Has no effect on builtin plugins"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551
msgid "Customize plugin. Specify name of plugin and customization string separated by a comma."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553
msgid "List all installed plugins"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555
msgid "Enable the named plugin"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557
msgid "Disable the named plugin"
msgstr ""
@@ -583,11 +584,11 @@ msgstr ""
msgid "Communicate with Android phones."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50
+#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52
msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92
+#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94
msgid "Communicate with S60 phones."
msgstr ""
@@ -651,7 +652,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244
#: /home/kovid/work/calibre/src/calibre/library/database2.py:198
#: /home/kovid/work/calibre/src/calibre/library/database2.py:211
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134
msgid "News"
msgstr ""
@@ -659,8 +660,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:556
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693
msgid "Catalog"
msgstr ""
@@ -740,23 +741,23 @@ msgstr ""
msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22
msgid "Communicate with the Hanvon N520 eBook reader."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47
msgid "Communicate with The Book reader."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59
msgid "Communicate with the SpringDesign Alex eBook reader."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78
msgid "Communicate with the Azbooka"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94
msgid "Communicate with the Elonex EB 511 eBook reader."
msgstr ""
@@ -813,7 +814,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63
#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66
#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74
@@ -823,33 +824,33 @@ msgstr ""
msgid "Getting list of books on device..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271
msgid "Removing books from device..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283
msgid "Removing books from device metadata listing..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247
msgid "Adding books to device metadata listing..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392
#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252
msgid "Not Implemented"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393
msgid "\".kobo\" files do not exist on the device as books instead, they are rows in the sqlite database. Currently they cannot be exported or viewed."
msgstr ""
@@ -2650,7 +2651,7 @@ msgstr ""
msgid "Copy to Clipboard"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462
msgid "Choose Files"
msgstr ""
@@ -2771,6 +2772,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28
#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95
#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120
msgid "No book selected"
@@ -2813,8 +2815,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92
msgid "No books selected"
msgstr ""
@@ -2959,7 +2961,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101
-#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554
+#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584
msgid "Not allowed"
msgstr ""
@@ -3026,7 +3028,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428
msgid "Failed"
msgstr ""
@@ -3259,28 +3261,28 @@ msgid "Error"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:141
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:177
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:179
msgid "Cannot edit metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210
msgid "Cannot merge books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211
msgid "At least two books must be selected for merging"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215
msgid "Book formats and metadata from the selected books will be added to the first selected book. ISBN will not be merged. Cannot upload books to device there is no more free space available "
msgstr ""
@@ -5199,7 +5223,7 @@ msgid "My Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69
-#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297
+#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301
msgid "Generate catalog"
msgstr ""
@@ -5505,91 +5529,91 @@ msgstr ""
msgid "Note: you can destroy your library using this feature. Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386
msgid "Search/replace invalid"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387
msgid "Search pattern is invalid: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419
msgid "Applying changes to %d books. This may take a while."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229
msgid "Edit Meta information"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231
msgid "A&utomatically set author sort"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232
msgid "Author s&ort: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233
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:233
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383
msgid "&Rating:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385
msgid "Rating of this book. 0-5 stars"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237
msgid "No change"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386
msgid " stars"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240
msgid "Add ta&gs: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391
msgid "Open Tag Editor"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244
msgid "&Remove tags:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245
msgid "Comma separated list of tags to remove from the books. "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246
msgid "Check this box to remove all tags from the books."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247
msgid "Remove all"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251
msgid "Remove &format:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252
msgid "&Swap title and author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253
msgid ""
"Selected books will be automatically numbered,\n"
"in the order you selected them.\n"
@@ -5597,56 +5621,56 @@ msgid ""
"Book A will have series number 1 and Book B series number 2."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258
msgid ""
"Remove stored conversion settings for the selected books.\n"
"\n"
"Future conversion of these books will use the default settings."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261
msgid "Remove &stored conversion settings for the selected books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422
msgid "&Basic metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423
msgid "&Custom metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264
msgid "Search &field:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265
msgid "&Search for:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266
msgid "&Replace with:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267
msgid "Apply function &after replace:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268
msgid "Test &text"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269
msgid "Test re&sult"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270
msgid "Your test:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271
msgid "&Search and replace (experimental)"
msgstr ""
@@ -5704,189 +5728,193 @@ msgstr ""
msgid "The cover in the %s format is invalid"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351
msgid " The green color indicates that the current author sort matches the current author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354
msgid " The red color indicates that the current author sort does not match the current author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359
msgid "Abort the editing of all remaining books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529
msgid "This ISBN number is valid"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532
msgid "This ISBN number is invalid"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611
msgid "Cannot use tag editor"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612
msgid "The tags editor cannot be used if you have modified the tags"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632
msgid "Downloading cover..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660
msgid "Cannot fetch cover"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661
msgid "Could not fetch cover. Could not convert: %s It is a DRMed book. You must first remove the DRM using third party tools."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432
msgid "Recipe Disabled"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447
msgid "Failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development. Your donation helps keep calibre development going."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512
msgid ""
" is communicating with the device! Migrating old database to ebook library in %s
The second and subsequently selected books will not be deleted or changed.
Please confirm you want to proceed."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227
msgid "Book formats and metadata from the selected books will be merged into the first selected book. ISBN will not be merged.
After merger the second and subsequently selected books will be deleted.
All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your computer.
Are you sure you want to proceed?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240
msgid "You are about to merge more than 5 books. Are you sure you want to proceed?"
msgstr ""
@@ -3457,6 +3459,28 @@ msgstr ""
msgid "Books with the same tags"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54
+msgid "Tweak ePub"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16
+msgid "Make small changes to ePub format books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17
+msgid "T"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39
+msgid "Cannot tweak ePub"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40
+msgid "No ePub available. First convert the book to ePub."
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24
msgid "V"
msgstr ""
@@ -3517,7 +3541,7 @@ msgid "The specified directory could not be processed."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:228
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811
msgid "No books"
msgstr ""
@@ -3631,13 +3655,13 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161
@@ -4361,7 +4385,7 @@ msgid " is not a valid picture"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413
msgid "Book Cover"
msgstr ""
@@ -4370,7 +4394,7 @@ msgid "Use cover from &source file"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414
msgid "Change &cover image:"
msgstr ""
@@ -4379,18 +4403,18 @@ msgid "Browse for an image to use as the cover of this book."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372
msgid "&Title: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373
msgid "Change the title of this book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376
msgid "&Author(s): "
msgstr ""
@@ -4403,39 +4427,39 @@ msgid "Change the author(s) of this book. Multiple authors should be separated b
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387
msgid "&Publisher: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388
msgid "Ta&gs: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389
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/convert/metadata_ui.py:185
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392
msgid "&Series:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394
msgid "List of known series. You can add new series."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399
msgid "Book "
msgstr ""
@@ -4914,7 +4938,7 @@ msgid " index:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257
msgid "Automatically number books in this series"
msgstr ""
@@ -5024,129 +5048,129 @@ msgstr ""
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/device.py:716
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720
msgid "Device: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722
msgid " detected."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812
msgid "selected to send"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817
msgid "Choose format to send to device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826
msgid "No device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827
msgid "Cannot send: No device is connected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834
msgid "No card"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835
msgid "Cannot send: Device has no storage card"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876
msgid "E-book:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879
msgid "Attached, you will find the e-book"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107
msgid "by"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881
msgid "in the %s format."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894
msgid "Sending email to"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214
msgid "No suitable formats"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925
msgid "Auto convert the following books before sending via email?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933
msgid "Could not email the following books as no suitable formats were found:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951
msgid "Failed to email books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952
msgid "Failed to email the following books:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956
msgid "Sent by email:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984
msgid "News:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985
msgid "Attached is the"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996
msgid "Sent news to"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207
msgid "Auto convert the following books before uploading to the device?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056
msgid "Sending catalogs to device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120
msgid "Sending news to device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173
msgid "Sending books to device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215
msgid "Could not upload the following books to the device, as no suitable formats were found. Convert the book(s) to a format supported by your device first."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277
msgid "No space on device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278
msgid "
"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646
msgid "The download timed out."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650
msgid "Could not find cover for this book. Try specifying the ISBN first."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662
msgid "For the error message from each cover source, click Show details below."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669
msgid "Bad cover"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670
msgid "The cover is not a valid picture"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703
msgid "There were errors"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704
msgid "There were errors downloading social metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733
msgid "Cannot fetch metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734
msgid "You must specify at least one of ISBN, Title, Authors or Publisher"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820
msgid "Permission denied"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821
msgid "Could not open %s. Is it being used by another program?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370
msgid "Edit Meta Information"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371
msgid "Meta information"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374
msgid "Swap the author and title"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377
msgid "Author S&ort: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378
msgid ""
"Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.\n"
"If the box is colored green, then text matches the individual author's sort strings. If it is colored red, then the authors and this text do not match."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380
msgid ""
"Automatically create the author sort entry based on the current author entry.\n"
"Using this button to create author sort will change author sort from red to green."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395
msgid "Remove unused series (Series that have no books)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397
msgid "IS&BN:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398
msgid "Publishe&d:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401
msgid "dd MMM yyyy"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402
msgid "&Date:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403
msgid "&Comments"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404
msgid "&Fetch metadata from server"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405
msgid "Available Formats"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406
msgid "Add a new format for this book to the database"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408
msgid "Remove the selected formats for this book from the database."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410
msgid "Set the cover for the book from the selected format"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412
msgid "Update metadata from the metadata in the selected format"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415
msgid "&Browse"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416
+msgid "Remove border (if any) from cover"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417
msgid "Reset cover to default"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419
msgid "Download co&ver"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420
msgid "Generate a default cover based on the title and author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421
msgid "&Generate cover"
msgstr ""
@@ -6365,6 +6393,35 @@ msgstr ""
msgid "&Test"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55
+msgid "Display contents of exploded ePub"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56
+msgid "&Explode ePub"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57
+msgid "Rebuild ePub from exploded contents"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58
+msgid "&Rebuild ePub"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59
+msgid "Discard changes"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218
+msgid "&Cancel"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61
+msgid "Explode the ePub to display contents in a file browser window. To tweak individual files, right-click, then 'Open with...' your editor of choice. When tweaks are complete, close the file browser window. Rebuild the ePub, updating your calibre library."
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127
msgid "No recipe selected"
msgstr ""
@@ -6737,7 +6794,7 @@ msgid "Show books in the main memory of the device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:656
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:655
msgid "Card A"
msgstr ""
@@ -6746,7 +6803,7 @@ msgid "Show books in storage card A"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:658
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:657
msgid "Card B"
msgstr ""
@@ -6869,7 +6926,7 @@ msgstr ""
msgid "Restore default layout"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555
+#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585
msgid "Dropping onto a device is not supported. First add the book to the calibre library."
msgstr ""
@@ -7550,10 +7607,6 @@ msgstr ""
msgid "&Apply"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218
-msgid "&Cancel"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222
msgid "Restore &defaults"
msgstr ""
@@ -7811,7 +7864,7 @@ msgid "Here you can control how calibre will save your books when you click the
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320
msgid "Failed to start content server"
msgstr ""
@@ -8191,71 +8244,71 @@ msgstr ""
msgid "Queueing "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239
+#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243
msgid "Fetch news from "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309
+#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313
msgid "Convert existing"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310
+#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314
msgid "The following books have already been converted to %s format. Do you wish to reconvert them?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168
msgid "&Restore"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170
msgid "&Donate to support calibre"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174
msgid "&Eject connected device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216
msgid "Calibre Quick Start Guide"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446
msgid "Conversion Error"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419
msgid "
\n"
" Quitting may cause corruption on the device.
\n"
" Are you sure you want to quit?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516
msgid "WARNING: Active jobs"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584
msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray."
msgstr ""
@@ -8982,48 +9035,48 @@ msgstr ""
msgid "Turn on the &content server"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:232
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:234
msgid "today"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:235
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:237
msgid "yesterday"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:238
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:240
msgid "thismonth"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:241
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:242
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:243
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:244
msgid "daysago"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:406
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:416
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:408
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:418
msgid "no"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:406
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:416
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:408
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:418
msgid "unchecked"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:409
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:419
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:411
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:421
msgid "checked"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:409
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:419
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:411
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:421
msgid "yes"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:413
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:415
msgid "blank"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/caches.py:413
+#: /home/kovid/work/calibre/src/calibre/library/caches.py:415
msgid "empty"
msgstr ""
@@ -9557,31 +9610,31 @@ msgstr ""
msgid "%sAverage rating is %3.1f"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:654
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:653
msgid "Main"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998
msgid "