diff --git a/Changelog.yaml b/Changelog.yaml index 34beb86956..4ff8ebf7fb 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -45,7 +45,7 @@ - title: "SONY driver: Use the tz field (available in newer readers) to set timestamps correctly, when available." - title: "Shortening file paths: Handle the case of very long filenames with periods in them." - title: [6566] + tickets: [6566] new recipes: - title: "The TMZ and Atlanta Journal Constitution" diff --git a/resources/images/news/fstream.png b/resources/images/news/fstream.png new file mode 100644 index 0000000000..a9fc6b4aae Binary files /dev/null and b/resources/images/news/fstream.png differ diff --git a/resources/images/news/la_jornada.png b/resources/images/news/la_jornada.png new file mode 100644 index 0000000000..718731a380 Binary files /dev/null and b/resources/images/news/la_jornada.png differ diff --git a/resources/recipes/clarin.recipe b/resources/recipes/clarin.recipe index 7bbb663d1d..cf9440ad55 100644 --- a/resources/recipes/clarin.recipe +++ b/resources/recipes/clarin.recipe @@ -18,7 +18,7 @@ class Clarin(BasicNewsRecipe): use_embedded_content = False no_stylesheets = True encoding = 'utf8' - language = 'es_AR' + language = 'es' publication_type = 'newspaper' INDEX = 'http://www.clarin.com' masthead_url = 'http://www.clarin.com/static/CLAClarin/images/logo-clarin-print.jpg' diff --git a/resources/recipes/europasur.recipe b/resources/recipes/europasur.recipe new file mode 100644 index 0000000000..cda111e995 --- /dev/null +++ b/resources/recipes/europasur.recipe @@ -0,0 +1,68 @@ + +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +europasur.es +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Europasur(BasicNewsRecipe): + title = 'Europa Sur' + __author__ = 'Darko Miletic' + description = 'News in Spanish' + publisher = 'Joly Digital' + category = 'news, politics, Spanish' + oldest_article = 2 + max_articles_per_feed = 100 + use_embedded_content = False + remove_empty_feeds = True + delay = 2 + no_stylesheets = True + encoding = 'cp1252' + language = 'es' + publication_type = 'newspaper' + extra_css = """ body{font-family: Verdana,Arial,Helvetica,sans-serif} + h2{font-family: Georgia,Times New Roman,Times,serif} + .subtitle{font-weight:bold} + .caption{font-size: small} + .body{font-size: 1.1em} + .info{color: #848484} + """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher': publisher + , 'language' : language + } + + keep_only_tags = [ + dict(attrs={'class':['titles','current']}) + ,dict(attrs={'id':'newsBody'}) + ] + remove_tags = [ + dict(name=['iframe','base','embed','object']) + ,dict(name='a', attrs={'class':'zoom thickbox'}) + ,dict(name='div', attrs={'class':'other'}) + ] + remove_attributes = ['width','height'] + + feeds = [ + (u'Portada', u'http://www.europasur.es/rss/articles.php') + ,(u'Deportes', u'http://www.europasur.es/rss/articles.php?sec=1224') + ,(u'Economia', u'http://www.europasur.es/rss/articles.php?sec=427') + ,(u'Espana', u'http://www.europasur.es/rss/articles.php?sec=437') + ,(u'Mundo', u'http://www.europasur.es/rss/articles.php?sec=428') + ,(u'Pasarela', u'http://www.europasur.es/rss/articles.php?sec=1958') + ,(u'Ocio y cultura', u'http://www.europasur.es/rss/articles.php?sec=1210') + ,(u'Opinion', u'http://www.europasur.es/rss/articles.php?sec=1195') + ,(u'Tecnologia', u'http://www.europasur.es/rss/articles.php?sec=1681') + ,(u'Salud', u'http://www.europasur.es/rss/articles.php?sec=2379') + ] + + def image_url_processor(self, baseurl, url): + artl, sep, width = url.rpartition('&an=') + artid, sep, ext = artl.rpartition('.') + article_id = artid.rpartition('/')[2] + return 'http://media.grupojoly.com/cache/' + article_id + '_' + width + 'x' + width + '_' + ext + '000.' + ext diff --git a/resources/recipes/fstream.recipe b/resources/recipes/fstream.recipe new file mode 100644 index 0000000000..f6d56042d1 --- /dev/null +++ b/resources/recipes/fstream.recipe @@ -0,0 +1,64 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class FIELDSTREAM(BasicNewsRecipe): + title = 'Field and Stream' + __author__ = 'Starson17 and Tonythebookworm' + description = 'Hunting and Fishing and Gun Talk' + language = 'en' + no_stylesheets = True + publisher = 'Starson17 and Tonythebookworm' + category = 'food recipes, hunting, fishing, guns' + use_embedded_content= False + no_stylesheets = True + oldest_article = 24 + remove_javascript = True + remove_empty_feeds = True + masthead_url = 'http://www.fieldandstream.com/sites/all/themes/fs/logo.png' + cover_url = 'http://www.arrowheadflyangler.com/Portals/1/Articles/FieldStream/Field%20and%20Stream%20March%20Fishing%20Edition%20Article%20Cover.jpg' + # recursions = 0 + max_articles_per_feed = 10 + INDEX = 'http://www.fieldandstream.com' + + keep_only_tags = [dict(name='div', attrs={'class':['interior-main']}) + ] + remove_tags = [dict(name='div', attrs={'id':['comments']})] + + def parse_index(self): + feeds = [] + for title, url in [ + (u"Wild Chef", u"http://www.fieldandstream.com/blogs/wild-chef"), + (u"The Gun Nut", u"http://www.fieldandstream.com/blogs/gun-nut"), + (u"Whitetail 365", u"http://www.fieldandstream.com/blogs/whitetail-365"), + (u"Fly Talk", u"http://www.fieldandstream.com/blogs/flytalk"), + (u"Generation Wild", u"http://www.fieldandstream.com/blogs/generation-wild"), + (u"Conservationist", u"http://www.fieldandstream.com/blogs/conservationist"), + (u"Honest Angler", u"http://www.fieldandstream.com/blogs/honest-angler"), + (u"Mans Best Friend", u"http://www.fieldandstream.com/blogs/mans-best-friend"), + + ]: + articles = self.make_links(url) + if articles: + feeds.append((title, articles)) + return feeds + + def make_links(self, url): + title = 'Temp' + current_articles = [] + soup = self.index_to_soup(url) + print 'The soup is: ', soup + for item in soup.findAll('h2'): + print 'item is: ', item + link = item.find('a') + print 'the link is: ', link + if link: + url = self.INDEX + link['href'] + title = self.tag_to_string(link) + print 'the title is: ', title + print 'the url is: ', url + print 'the title is: ', title + current_articles.append({'title': title, 'url': url, 'description':'', 'date':''}) # append all this + return current_articles + + + + diff --git a/resources/recipes/hawaii.recipe b/resources/recipes/hawaii.recipe new file mode 100644 index 0000000000..30a2b26def --- /dev/null +++ b/resources/recipes/hawaii.recipe @@ -0,0 +1,55 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'West Hawaii Today' + language = 'en' + __author__ = 'Tony Stegall' + description = 'Westhawaiitoday.com' + publisher = 'West Hawaii ' + category = 'news,Hawaii,USA' + oldest_article = 7 + max_articles_per_feed = 100 + no_stylesheets = True + remove_javascript = True + + masthead_url = 'http://images.townnews.com/westhawaiitoday.com/art/whttoplogo.gif' + + + + + + feeds = [ + ('Local News', 'http://www.westhawaiitoday.com/?rss=local/'), + ('Local Sports', 'http://www.westhawaiitoday.com/?rss=sports/local_sports/'), + ('Big Fish List', 'http://www.westhawaiitoday.com/?rss=sports/big_fish_list/'), + ('Local Features' 'http://www.westhawaiitoday.com/?rss=features/'), + ('Obituaries', 'http://www.westhawaiitoday.com/?rss=obituaries/'), + ('Letters To Editor', 'http://www.westhawaiitoday.com/?rss=opinion/letters_-_your_voice/'), + ('Editorial', 'http://www.westhawaiitoday.com/?rss=opinion/editorial/'), + ('Columns', 'http://www.westhawaiitoday.com/?rss=opinion/columns/'), + ('Volcano Update Sunday', 'http://www.westhawaiitoday.com/?rss=volcano/') + ] + + def print_version(self, url): + split1 = url.split("//") + url1 = split1[1] + xxx = split1[2] + split2 = xxx.split(".") + artid = split2[0] + print 'ARTICLE ID IS: ', artid + + #example of link to convert + #Original link: http://www.westhawaiitoday.com/articles/2010/08/27/local//local01.txt + #print version: http://www.westhawaiitoday.com/articles/2010/08/27/local//local01.prt + + print_url = 'http://' + url1 + '//' + artid + '.prt' + print 'print_url is: ', print_url + return print_url + + #test with ebook-convert hawaii.recipe output_dir --test -vv > myrecipe.txt + + + + + + diff --git a/resources/recipes/la_jornada.recipe b/resources/recipes/la_jornada.recipe index edcd1ec9a7..2e1a3bb50d 100644 --- a/resources/recipes/la_jornada.recipe +++ b/resources/recipes/la_jornada.recipe @@ -1,120 +1,64 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' -__copyright__ = '2010, Rogelio Dominguez ' +__copyright__ = '2010, Darko Miletic ' ''' www.jornada.unam.mx ''' +from calibre import strftime from calibre.web.feeds.news import BasicNewsRecipe -from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup -import re +class LaJornada_mx(BasicNewsRecipe): + title = 'La Jornada (Mexico)' + __author__ = 'Darko Miletic' + description = 'Noticias del diario mexicano La Jornada' + publisher = 'DEMOS, Desarrollo de Medios, S.A. de C.V.' + category = 'news, Mexico' + oldest_article = 2 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = False + language = 'es' + remove_empty_feeds = True + cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/planitas/portadita.jpg") + masthead_url = 'http://www.jornada.unam.mx/v7.0/imagenes/la-jornada-trans.png' + extra_css = """ + body{font-family: "Times New Roman",serif } + .cabeza{font-size: xx-large; font-weight: bold } + .credito-articulo{font-size: 1.3em} + """ -class LaJornada(BasicNewsRecipe): - title = u'La Jornada' - language = 'es' - oldest_article = 1 - __author__ = 'rogeliodh' - max_articles_per_feed = 100 - remove_tags = [dict(name='div', attrs={'class':['go gui','go gui top','comment-cont',]})] - remove_tags_before = dict(id='article-cont') - remove_tags_after = dict(id='article-cont') - no_stylesheets = True - extra_css = ' .series{ \ - border-bottom: 1px solid #626366; \ - font-weight: bold; \ - } \ - .sumario{ \ - font-weight: bold; \ - margin-top: 2em; \ - text-align: center \ - } \ - p.sumario{ \ - text-align: center \ - } \ - .sumarios{font-weight: bold} \ - .cabeza{ font-size: 1.5em} \ - .pie-foto { \ - text-align: justify; \ - font-size: 0.8em; \ - text-align: justify; \ - } \ - .pie-foto .credito { \ - font-weight: bold; \ - display: block \ - } \ - .credito-autor{ \ - margin-top: 1.5em; \ - padding-left: 0.6em; \ - border-bottom: 1px solid #626366; \ - font-variant: small-caps; \ - font-weight: bold \ - } \ - .credito-articulo{ \ - margin-top: 1.5em; \ - padding-left: 0.6em; \ - border-bottom: 1px solid #626366; \ - font-variant: small-caps; \ - font-weight: bold \ - } \ - .credito-titulo{text-align: right} \ - .hemero { \ - text-align: right; \ - font-size: 0.9em; \ - margin-bottom: 8px; \ - } \ - .loc { \ - font-weight: bold; \ - } \ - .carton { \ - text-align: center; \ - } \ - .credit { \ - font-weight: bold; \ - } \ - ' + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } - preprocess_regexps = [ - # Remove capitalized initial letter on some articles (editorial) - (re.compile(r'
(.*)

', re.DOTALL|re.IGNORECASE), - lambda match: match.group(1)), - # Cartons section uses a class instead of a div to identify the main content. Change it. - (re.compile(r'class="carton"', re.DOTALL|re.IGNORECASE), - lambda match: 'id="article-cont" class="carton"'), - # Remove as calibre has a bug (to report) - (re.compile(r'', re.DOTALL|re.IGNORECASE), - lambda match: ''), - ] - - INDEX = 'http://www.jornada.unam.mx/rss/edicion.xml' - feeds = [ - (u'Opinion','http://www.jornada.unam.mx/rss/opinion.xml'), - (u'Cartones','http://www.jornada.unam.mx/rss/cartones.xml'), - (u'Política','http://www.jornada.unam.mx/rss/politica.xml'), - (u'Economía','http://www.jornada.unam.mx/rss/economia.xml'), - (u'Mundo','http://www.jornada.unam.mx/rss/mundo.xml'), - (u'Estados','http://www.jornada.unam.mx/rss/estados.xml'), - (u'Capital','http://www.jornada.unam.mx/rss/capital.xml'), - (u'Sociedad','http://www.jornada.unam.mx/rss/sociedad.xml'), - (u'Ciencias','http://www.jornada.unam.mx/rss/ciencias.xml'), - (u'Cultura','http://www.jornada.unam.mx/rss/cultura.xml'), - (u'Gastronomia','http://www.jornada.unam.mx/rss/gastronomia.xml'), - (u'Espectáculos','http://www.jornada.unam.mx/rss/espectaculos.xml'), - (u'Deportes','http://www.jornada.unam.mx/rss/deportes.xml'), + keep_only_tags = [ + dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','text']}) + ,dict(name='div', attrs={'id':'renderComments'}) ] + remove_tags = [dict(name='div', attrs={'class':'buttonbar'})] - def get_cover_url(self): - ''' - Cover URL is http://www.jornada.unam.mx/YYYY/MM/DD/portada.pdf - ''' - cover_url = None - soup = self.index_to_soup(self.INDEX) - soupstone = BeautifulStoneSoup(str(soup)) - urlbase = str(soupstone('link')[0]) - r= re.compile(r'.*http://www.jornada.unam.mx/([0-9]{4})/([0-9]{2})/([0-9]{2})', re.DOTALL|re.IGNORECASE) - m = r.match(urlbase) - if m: - cover_url = 'http://www.jornada.unam.mx/' + m.groups()[0] + '/' + m.groups()[1] + '/' + m.groups()[2] + '/portada.pdf' + feeds = [ + (u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' ) + ,(u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' ) + ,(u'Politica' , u'http://www.jornada.unam.mx/rss/politica.xml' ) + ,(u'Economia' , u'http://www.jornada.unam.mx/rss/economia.xml' ) + ,(u'Mundo' , u'http://www.jornada.unam.mx/rss/mundo.xml' ) + ,(u'Estados' , u'http://www.jornada.unam.mx/rss/estados.xml' ) + ,(u'Capital' , u'http://www.jornada.unam.mx/rss/capital.xml' ) + ,(u'Sociedad y justicia' , u'http://www.jornada.unam.mx/rss/sociedad.xml' ) + ,(u'Ciencias' , u'http://www.jornada.unam.mx/rss/ciencias.xml' ) + ,(u'Cultura' , u'http://www.jornada.unam.mx/rss/cultura.xml' ) + ,(u'Gastronomia' , u'http://www.jornada.unam.mx/rss/gastronomia.xml' ) + ,(u'Espectaculos' , u'http://www.jornada.unam.mx/rss/espectaculos.xml' ) + ,(u'Deportes' , u'http://www.jornada.unam.mx/rss/deportes.xml' ) + ] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup - return cover_url diff --git a/resources/recipes/mdj.recipe b/resources/recipes/mdj.recipe new file mode 100644 index 0000000000..b7a5fe0d63 --- /dev/null +++ b/resources/recipes/mdj.recipe @@ -0,0 +1,50 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'Marietta Daily Journal' + __author__ = 'Tony Stegall' + language = 'en' + description = 'Marietta Ga and Metro Atlanta News' + publisher = 'MDJ' + category = 'news,politics,Georgia,USA' + oldest_article = 1 + max_articles_per_feed = 100 + no_stylesheets = True + remove_javascript = True + + masthead_url = 'http://assets.matchbin.com/sites/624/assets/logo.gif' + + + keep_only_tags = [ + dict(name='div', attrs={'id':['print_content_container']}) + + ] + + + feeds = [ + ('Local News', 'http://mdjonline.com/rss/rss/Local+News?content_type=article&tags=news&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Local+News'), + ('Sports', 'http://mdjonline.com/rss/rss/Sports?content_type=article&tags=sports&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Sports'), + ('Obits', 'http://mdjonline.com/rss/rss/Obits?content_type=article&tags=obits&page_name=rss&tag_inclusion=or&offset=0&limit=20&instance=Obits'), + ('Editorial & oped', 'http://mdjonline.com/rss/rss/Editorial+and+OPED?content_type=article&tags=oped+editorial&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Editorial+and+OPED'), + ('Lifestyle', 'http://mdjonline.com/rss/rss/Lifestyle?content_type=article&tags=lifestyle&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Lifestyle'), + ('Blogs', 'http://mdjonline.com/rss/rss/Lifestyle?content_type=article&tags=lifestyle&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Lifestyle') + ] + + def print_version(self, url): + split1 = url.split("/") + artid = split1[4] + + #example of link to convert + #Original link: http://mdjonline.com/bookmark/9274197 + #print version: http://mdjonline.com/printer_friendly/9274197 + + print_url = 'http://mdjonline.com/printer_friendly/' + artid + return print_url + + #test with ebook-convert nejm.recipe output_dir --test -vv > myrecipe.txt + + + + + + diff --git a/resources/recipes/slate.recipe b/resources/recipes/slate.recipe index 07ed89d0f4..c03255d2df 100644 --- a/resources/recipes/slate.recipe +++ b/resources/recipes/slate.recipe @@ -102,7 +102,6 @@ class PeriodicalNameHere(BasicNewsRecipe): todays_section = soup.find(True, attrs={'class':'todaydateline'}) self.section_dates.append(self.tag_to_string(todays_section,use_alt=False)) - self.section_dates.append(self.tag_to_string(todays_section,use_alt=False)) older_section_dates = soup.findAll(True, attrs={'class':'maindateline'}) for older_section in older_section_dates : diff --git a/resources/recipes/winnipeg_free_press.recipe b/resources/recipes/winnipeg_free_press.recipe new file mode 100644 index 0000000000..8c59dff645 --- /dev/null +++ b/resources/recipes/winnipeg_free_press.recipe @@ -0,0 +1,30 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class WinnipegFreePress(BasicNewsRecipe): + title = u'Winnipeg Free Press' + __author__ = 'buyo' + description = 'News from Winnipeg, Manitoba, Canada' + oldest_article = 1 + max_articles_per_feed = 15 + category = 'News, Winnipeg, Canada' + cover_url = 'http://media.winnipegfreepress.com/designimages/winnipegfreepress_WFP.gif' + no_stylesheets = True + encoding = 'UTF-8' + remove_javascript = True + use_embedded_content = False + language = 'en_CA' + + feeds = [(u'Breaking News', u'http://www.winnipegfreepress.com/rss?path=/breakingnews'), + (u'Local News',u'http://www.winnipegfreepress.com/rss?path=/local'), + (u'Breaking Business News',u'http://www.winnipegfreepress.com/rss?path=/business/finance'), + (u'Business',u'http://www.winnipegfreepress.com/rss?path=/business'), + (u'Editorials',u'http://www.winnipegfreepress.com/rss?path=/opinion/editorials'), + (u'Views from the West',u'http://www.winnipegfreepress.com/rss?path=/opinion/westview'), + (u'Life & Style',u'http://www.winnipegfreepress.com/rss?path=/life'), + (u'Food & Drink',u'http://www.winnipegfreepress.com/rss?path=/life/food') + ] + + keep_only_tags = [ + dict(name='div', attrs={'id':'article_header'}), + dict(name='div', attrs={'class':'article'}), + ] diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 6ecdf93084..49ce83864e 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -84,6 +84,9 @@ if plugins is None: # }}} # config_dir {{{ + +CONFIG_DIR_MODE = 0700 + if os.environ.has_key('CALIBRE_CONFIG_DIRECTORY'): config_dir = os.path.abspath(os.environ['CALIBRE_CONFIG_DIRECTORY']) elif iswindows: @@ -98,7 +101,11 @@ elif isosx: else: bdir = os.path.abspath(os.path.expanduser(os.environ.get('XDG_CONFIG_HOME', '~/.config'))) config_dir = os.path.join(bdir, 'calibre') - if not os.access(config_dir, os.W_OK): + try: + os.makedirs(config_dir, mode=CONFIG_DIR_MODE) + except: + pass + if not os.access(config_dir, os.W_OK) or not os.access(config_dir, os.X_OK): print 'No write acces to', config_dir, 'using a temporary dir instead' import tempfile, atexit config_dir = tempfile.mkdtemp(prefix='calibre-config-') diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index 1c3d05ea12..4ccbf98a9a 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -11,7 +11,7 @@ from calibre.devices.usbms.books import Book as Book_ class Book(Book_): def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, - thumbnail_name, other=None): + thumbnail_name, size=None, other=None): Book_.__init__(self, prefix, lpath) self.title = title @@ -20,10 +20,8 @@ class Book(Book_): else: self.authors = [authors] self.mime = mime - try: - self.size = os.path.getsize(self.path) - except OSError: - self.size = 0 + + self.size = size # will be set later if None try: if ContentType == '6': self.datetime = time.strptime(date, "%Y-%m-%dT%H:%M:%S.%f") diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 5f939a4498..0bd117b7c6 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -94,19 +94,19 @@ class KOBO(USBMS): idx = bl_cache.get(lpath, None) if idx is not None: + bl_cache[lpath] = None if ImageID is not None: imagename = self.normalize_path(self._main_prefix + '.kobo/images/' + ImageID + ' - NickelBookCover.parsed') #print "Image name Normalized: " + imagename if imagename is not None: bl[idx].thumbnail = ImageWrapper(imagename) - bl_cache[lpath] = None if ContentType != '6': if self.update_metadata_item(bl[idx]): # print 'update_metadata_item returned true' changed = True bl[idx].device_collections = playlist_map.get(lpath, []) else: - book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID) + book = self.book_from_path(prefix, lpath, title, authors, mime, date, ContentType, ImageID) # print 'Update booklist' if bl.add_book(book, replace_metadata=False): changed = True @@ -316,10 +316,10 @@ class KOBO(USBMS): lpath = lpath[1:] #print "path: " + lpath #book = self.book_class(prefix, lpath, other=info) - lpath = self.normalize_path(prefix + lpath) book = Book(prefix, lpath, '', '', '', '', '', '', other=info) if book.size is None: book.size = os.stat(self.normalize_path(path)).st_size + book._new_book = True # Must be before add_book booklists[blist].add_book(book, replace_metadata=True) self.report_progress(1.0, _('Adding books to device metadata listing...')) @@ -380,3 +380,19 @@ class KOBO(USBMS): return USBMS.get_file(self, path, *args, **kwargs) + @classmethod + def book_from_path(cls, prefix, lpath, title, authors, mime, date, ContentType, ImageID): + from calibre.ebooks.metadata import MetaInformation + + if cls.settings().read_metadata or cls.MUST_READ_METADATA: + mi = cls.metadata_from_path(cls.normalize_path(os.path.join(prefix, lpath))) + else: + from calibre.ebooks.metadata.meta import metadata_from_filename + mi = metadata_from_filename(cls.normalize_path(os.path.basename(lpath)), + cls.build_template_regexp()) + if mi is None: + mi = MetaInformation(os.path.splitext(os.path.basename(lpath))[0], + [_('Unknown')]) + size = os.stat(cls.normalize_path(os.path.join(prefix, lpath))).st_size + book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID, size=size, other=mi) + return book diff --git a/src/calibre/ebooks/html/input.py b/src/calibre/ebooks/html/input.py index 51c74228b7..d57bfddd3e 100644 --- a/src/calibre/ebooks/html/input.py +++ b/src/calibre/ebooks/html/input.py @@ -491,6 +491,9 @@ class HTMLInput(InputFormatPlugin): return (None, raw) def preprocess_html(self, html): + if not hasattr(self, 'log'): + from calibre.utils.logging import default_log + self.log = default_log self.log("********* Preprocessing HTML *********") # Detect Chapters to match the xpath in the GUI chapdetect = re.compile(r'(?=]*>)?\s*(?P(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(|)?)(]*>)', re.IGNORECASE) diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index af350835a9..c36eb4915b 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -21,7 +21,8 @@ class SimilarBooksAction(InterfaceAction): m = QMenu(self.gui) for text, icon, target, shortcut in [ (_('Books by same author'), 'user_profile.svg', 'authors', _('Alt+A')), - (_('Books in this series'), 'books_in_series.svg', 'series', _('Alt+S')), + (_('Books in this series'), 'books_in_series.svg', 'series', + _('Alt+Shift+S')), (_('Books by this publisher'), 'publisher.png', 'publisher', _('Alt+P')), (_('Books with the same tags'), 'tags.svg', 'tag', _('Alt+T')),]: ac = self.create_action(spec=(text, icon, None, shortcut), diff --git a/src/calibre/gui2/dialogs/config/create_custom_column.py b/src/calibre/gui2/dialogs/config/create_custom_column.py index fdf093b6d5..c0f17b8cba 100644 --- a/src/calibre/gui2/dialogs/config/create_custom_column.py +++ b/src/calibre/gui2/dialogs/config/create_custom_column.py @@ -105,6 +105,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): return self.simple_error('', _('No lookup name was provided')) if re.match('^\w*$', col) is None or not col[0].isalpha() or col.lower() != col: return self.simple_error('', _('The lookup name must contain only lower case letters, digits and underscores, and start with a letter')) + if col.endswith('_index'): + return self.simple_error('', _('Lookup names cannot end with _index, because these names are reserved for the index of a series column.')) col_heading = unicode(self.column_heading_box.text()) col_type = self.column_types[self.column_type_box.currentIndex()]['datatype'] if col_type == '*text': diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 389208fdcd..966180467c 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -229,6 +229,8 @@ class BooksView(QTableView): # {{{ def cleanup_sort_history(self, sort_history): history = [] for col, order in sort_history: + if col == 'date': + col = 'timestamp' if col in self.column_map and (not history or history[0][0] != col): history.append([col, order]) return history diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 935776f838..6457e12905 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -265,7 +265,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # account for the series index column. Field_metadata knows that # the series index is one larger than the series. If you change # it here, be sure to change it there as well. - self.FIELD_MAP[str(col)+'_s_index'] = base = base+1 + self.FIELD_MAP[str(col)+'_index'] = base = base+1 + self.field_metadata.set_field_record_index( + self.custom_column_num_map[col]['label']+'_index', + base, + prefer_custom=True) self.FIELD_MAP['cover'] = base+1 self.field_metadata.set_field_record_index('cover', base+1, prefer_custom=False) diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index f29b432eec..2a79c3a75b 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -36,7 +36,7 @@ class FieldMetadata(dict): treated as a single term. If not None, it contains a string, and the field is assumed to contain a list of terms separated by that string - kind == standard: is a db field. + kind == field: is a db field. kind == category: standard tag category that isn't a field. see news. kind == user: user-defined tag category. kind == search: saved-searches category. @@ -239,7 +239,7 @@ class FieldMetadata(dict): 'is_multiple':None, 'kind':'field', 'name':None, - 'search_terms':[], + 'search_terms':['series_index'], 'is_custom':False, 'is_category':False}), ('sort', {'table':None, @@ -395,6 +395,18 @@ class FieldMetadata(dict): 'is_editable': is_editable,} self._add_search_terms_to_map(key, [key]) self.custom_label_to_key_map[label] = key + if datatype == 'series': + key += '_index' + self._tb_cats[key] = {'table':None, 'column':None, + 'datatype':'float', 'is_multiple':False, + 'kind':'field', 'name':'', + 'search_terms':[key], 'label':label+'_index', + 'colnum':None, 'display':{}, + 'is_custom':False, 'is_category':False, + 'link_column':None, 'category_sort':None, + 'is_editable': False,} + self._add_search_terms_to_map(key, [key]) + self.custom_label_to_key_map[label+'_index'] = key def remove_custom_fields(self): for key in self.get_custom_fields(): diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 87a0fecee3..c3a1d68749 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -19,6 +19,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.library.comments import comments_to_html from calibre import guess_type from calibre.utils.ordered_dict import OrderedDict +from calibre.utils.date import format_date BASE_HREFS = { 0 : '/stanza', @@ -130,7 +131,7 @@ def CATALOG_GROUP_ENTRY(item, category, base_href, version, updated): link ) -def ACQUISITION_ENTRY(item, version, FM, updated): +def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): title = item[FM['title']] if not title: title = _('Unknown') @@ -153,6 +154,21 @@ def ACQUISITION_ENTRY(item, version, FM, updated): extra.append(_('SERIES: %s [%s]
')%\ (series, fmt_sidx(float(item[FM['series_index']])))) + for key in CKEYS: + val = item[CFM[key]['rec_index']] + if val is not None: + name = CFM[key]['name'] + datatype = CFM[key]['datatype'] + if datatype == 'text' and CFM[key]['is_multiple']: + extra.append('%s: %s
'%(name, ', '.join(val.split('|')))) + elif datatype == 'series': + extra.append('%s: %s [%s]
'%(name, val, + fmt_sidx(item[CFM.cc_series_index_column_for(key)]))) + elif datatype == 'datetime': + extra.append('%s: %s
'%(name, + format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy')))) + else: + extra.append('%s: %s
' % (CFM[key]['name'], val)) comments = item[FM['comments']] if comments: comments = comments_to_html(comments) @@ -260,10 +276,14 @@ class NavFeed(Feed): class AcquisitionFeed(NavFeed): def __init__(self, updated, id_, items, offsets, page_url, up_url, version, - FM): + FM, CFM): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) + CKEYS = [key for key in sorted(CFM.get_custom_fields(), + cmp=lambda x,y: cmp(CFM[x]['name'].lower(), + CFM[y]['name'].lower()))] for item in items: - self.root.append(ACQUISITION_ENTRY(item, version, FM, updated)) + self.root.append(ACQUISITION_ENTRY(item, version, FM, updated, + CFM, CKEYS)) class CategoryFeed(NavFeed): @@ -360,7 +380,7 @@ class OPDSServer(object): cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog' return str(AcquisitionFeed(updated, id_, items, offsets, - page_url, up_url, version, self.db.FIELD_MAP)) + page_url, up_url, version, self.db.FIELD_MAP, self.db.field_metadata)) def opds_search(self, query=None, version=0, offset=0): try: @@ -568,7 +588,10 @@ class OPDSServer(object): (_('Newest'), _('Date'), 'Onewest'), (_('Title'), _('Title'), 'Otitle'), ] - for category in categories: + def getter(x): + return category_meta[x]['name'].lower() + for category in sorted(categories, + cmp=lambda x,y: cmp(getter(x), getter(y))): if len(categories[category]) == 0: continue if category == 'formats': diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index 7ffc77575e..e9573e91be 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -166,7 +166,7 @@ Search & Sort The Search & Sort section allows you to perform several powerful actions on your book collections. - * You can sort them by title, author, date, rating etc. by clicking on the column titles. + * You can sort them by title, author, date, rating etc. by clicking on the column titles. You can also sub-sort (i.e. sort on multiple columns). For example, if you click on the title column and then the author column, the book will be sorted by author and then all the entries for the same author will be sorted by title. * You can search for a particular book or set of books using the search bar. More on that below. @@ -212,9 +212,10 @@ metadata. You can build advanced search queries easily using the :guilabel:`Advanced Search Dialog`, accessed by clicking the button |sbi|. -Available fields for searching are: ``tag, title, author, publisher, series, rating, cover, comments, format, -isbn, date, pubdate, search, size`` and custom columns. If a device is plugged in, the ``ondevice`` field -becomes available. To find the search name for a custom column, hover your mouse over the column header. +Available fields for searching are: ``tag, title, author, publisher, series, series_index, rating, cover, +comments, format, isbn, date, pubdate, search, size`` and custom columns. If a device is plugged in, the +``ondevice`` field becomes available. To find the search name for a custom column, hover your mouse over the +column header. The syntax for searching for dates is:: @@ -223,9 +224,8 @@ The syntax for searching for dates is:: pubdate:=2009 Will find all books published in 2009 If the date is ambiguous, the current locale is used for date comparison. For example, in an mm/dd/yyyy -locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009. - -Some special date strings are available. The string ``today`` translates to today's date, whatever it is. The +locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009. Some +special date strings are available. The string ``today`` translates to today's date, whatever it is. The strings `yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare to a date some number of days ago, for example: date:>10daysago, date:<=45daysago. @@ -234,9 +234,15 @@ You can search for books that have a format of a certain size like this:: size:>1.1M Will find books with a format larger than 1.1MB size:<=1K Will find books with a format smaller than 1KB -Dates and numeric fields support the operators ``=`` (equals), ``>`` (greater than), ``>=`` (greater than or -equal to), ``<`` (less than), ``<=`` (less than or equal to), and ``!=`` (not equal to). Rating fields are -considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 or higher. +Dates and numeric fields support the relational operators ``=`` (equals), ``>`` (greater than), ``>=`` +(greater than or equal to), ``<`` (less than), ``<=`` (less than or equal to), and ``!=`` (not equal to). +Rating fields are considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 +or higher. + +Series indices are searchable. For the standard series, the search name is 'series_index'. For +custom series columns, use the column search name followed by _index. For example, to search the indices for a +custom series column named ``#my_series``, you would use the search name ``#my_series_index``. +Series indices are numbers, so you can use the relational operators described above. The special field ``search`` is used for saved searches. So if you save a search with the name "My spouse's books" you can enter ``search:"My spouse's books"`` in the search bar to reuse the saved @@ -310,6 +316,70 @@ Jobs The Jobs panel shows you the number of currently running jobs. Jobs are tasks that run in a separate process, they include converting ebooks and talking to your reader device. You can click on the jobs panel to access the list of jobs. Once a job has completed, by double-clicking it in the list, you can see a detailed log from that job. This is useful to debug jobs that may not have completed successfully. +Keyboard Shortcuts +--------------------- + +Calibre has several keyboard shortcuts to save you time and mouse movement. These shortcuts are active in the book list view (when you're not editing the details of a particular book), and most of them affect the title you have selected. The |app| e-book viewer has its own shortcuts, which can be customised by clicking the Preferences button in the viewer. + +.. note:: + + Note: The Calibre keyboard shortcuts do not require a modifier key (Command, Option, Control etc.), unless specifically noted. You only need to press the letter key, e.g. E to edit. + +.. list-table:: Keyboard Shortcuts + :widths: 10 100 + :header-rows: 1 + + * - Keyboard Shortcut + - Action + * - :kbd:`A` + - Add Books + * - :kbd:`C` + - Convert selected Books + * - :kbd:`D` + - Send to device + * - :kbd:`Del` + - Remove selected Books + * - :kbd:`E` + - Edit metadata of selected books + * - :kbd:`I` + - Show book details + * - :kbd:`M` + - Merge selected records + * - :kbd:`O` + - Open containing folder + * - :kbd:`S` + - Save to Disk + * - :kbd:`V` + - View + * - :kbd:`Alt+V/Cmd+V in OS X` + - View specific format + * - :kbd:`Alt+Shift+J` + - Toggle jobs list + * - :kbd:`Alt+Shift+B` + - Toggle Cover Browser + * - :kbd:`Alt+Shift+T` + - Toggle Tag Browser + * - :kbd:`Alt+A` + - Show books by the Same author as the current book + * - :kbd:`Alt+T` + - Show books with the same tags as current book + * - :kbd:`Alt+P` + - Show books by the same publisher as current book + * - :kbd:`Alt+Shift+S` + - Show books in the same series as current book + * - :kbd:`/, Ctrl+F` + - Focus the search bar + * - :kbd:`Ctrl+D` + - Download metadata and shortcuts + * - :kbd:`Ctrl+R` + - Restart calibre + * - :kbd:`Ctrl+Q` + - Quit calibre + + + + + diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 37ebba2665..a98ef07a82 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.15\n" -"POT-Creation-Date: 2010-08-20 13:28+MDT\n" -"PO-Revision-Date: 2010-08-20 13:28+MDT\n" +"Project-Id-Version: calibre 0.7.16\n" +"POT-Creation-Date: 2010-08-27 11:23+MDT\n" +"PO-Revision-Date: 2010-08-27 11:23+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -21,11 +21,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 #: /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 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -33,15 +33,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:236 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:282 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:240 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 @@ -98,10 +98,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:234 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:172 @@ -156,80 +156,97 @@ msgstr "" msgid "File type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:208 msgid "Metadata reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 msgid "Metadata writer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 msgid "Catalog generator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:16 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +msgid "Preferences" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 msgid "Follow all local links in an HTML file and create a ZIP file containing all linked files. This plugin is run every time you add an HTML file to the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:52 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 msgid "Character encoding for the input HTML files. Common choices include: cp1252, latin1, iso-8859-1 and utf-8." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:59 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 msgid "Create a PMLZ archive containing the PML file and all images in the directory pmlname_img or images. This plugin is run every time you add a PML file to the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:93 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 msgid "Extract cover from comic files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:120 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:131 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:143 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:153 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:163 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:174 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:184 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:204 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:214 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:224 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:121 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:132 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:144 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:154 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:164 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:175 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 msgid "Read metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 msgid "Read metadata from ebooks in RAR archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 msgid "Read metadata from ebooks in ZIP archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:334 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:344 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:354 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:397 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 msgid "Set metadata in %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 msgid "Set metadata from %s files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +msgid "Look and Feel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +msgid "Interface" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "" @@ -355,35 +372,35 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 msgid "Mapping for filetype plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 msgid "Local plugin customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 msgid "Disabled plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:38 msgid "Enabled plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:85 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 msgid "No valid plugin found in " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:489 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Initialization of plugin %s failed with traceback:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:522 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 msgid "" " %prog options\n" "\n" @@ -391,27 +408,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 msgid "Customize plugin. Specify name of plugin and customization string separated by a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 msgid "List all installed plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 msgid "Enable the named plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:538 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 msgid "Disable the named plugin" msgstr "" @@ -614,15 +631,15 @@ msgstr "" msgid "Communicate with the MiBuk Wolder reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 -msgid "Communicate with the Kindle 2 eBook reader." +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 +msgid "Communicate with the Kindle 2/3 eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 msgid "Communicate with the Kindle DX eBook reader." msgstr "" @@ -633,7 +650,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:161 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 #: /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 @@ -643,33 +660,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:221 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:265 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 #: /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:269 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:276 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 #: /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:281 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:315 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 #: /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:366 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 msgid "Not Implemented" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:367 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 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 "" @@ -1382,7 +1399,7 @@ msgstr "" msgid "Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" @@ -1400,19 +1417,23 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 +msgid "Try to turn chapters into individual sections. WARNING: This option is experimental. It can cause conversion to fail. It can also produce unexpected output." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "Traverse links in HTML files breadth first. Normally, they are traversed depth first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:256 msgid "Maximum levels of recursion when following links in HTML files. Must be non-negative. 0 implies that no links in the root HTML file are followed. Default is %default." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:265 msgid "Normally this input plugin re-arranges all the input files into a standard folder hierarchy. Only use this option if you know what you are doing as it can result in various nasty side effects in the rest of of the conversion pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 msgid "Average line length for line breaking if the HTML is from a previous partial conversion of a PDF file. Default is %default which disables this." msgstr "" @@ -1615,7 +1636,7 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:397 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 @@ -1628,7 +1649,7 @@ msgstr "" msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 @@ -1636,18 +1657,18 @@ msgstr "" msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 @@ -1659,7 +1680,7 @@ msgstr "" msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:409 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 @@ -1669,7 +1690,7 @@ msgstr "" msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:411 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 @@ -1679,22 +1700,22 @@ msgstr "" msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:412 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 msgid "Rights" msgstr "" @@ -2278,7 +2299,7 @@ msgstr "" msgid "Specify the character encoding of the output document. The default is cp1252." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:194 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML first and then try it.\n" "%s" @@ -2320,254 +2341,258 @@ msgstr "" msgid "Force splitting on the max-line-length value when no space is present. Also allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Show the cover flow in a separate window instead of in the main calibre window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 -msgid "A" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books from a single directory" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 +msgid "A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Add books from directories, including sub directories (Multiple books per directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "No book files found" msgstr "" @@ -2575,6 +2600,10 @@ msgstr "" msgid "Add books to library" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:14 +msgid "Add books to your calibre library from the connected device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 msgid "Fetch annotations (experimental)" @@ -2591,9 +2620,9 @@ msgid "User annotations generated from main library only" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 @@ -2631,43 +2660,43 @@ msgid "Location %d • %s
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Select destination for %s.%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 msgid "%d books" msgstr "" @@ -2676,34 +2705,34 @@ msgstr "" msgid "Choose calibre library to work with" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:83 msgid "Switch to library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:149 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:150 msgid "No existing calibre library was found at %s. It will be removed from the list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -2715,19 +2744,19 @@ msgstr "" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 msgid "Starting conversion of %d book(s)" msgstr "" @@ -2739,34 +2768,34 @@ msgstr "" msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:104 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:111 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 msgid "Copied %d books to %s" msgstr "" @@ -2855,46 +2884,46 @@ msgstr "" msgid "The selected books will be permanently deleted from your device. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:31 msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:48 msgid "Start Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:50 msgid "Stop Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid " and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81 msgid "Setup email based sharing of books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:117 msgid "Connect/share" msgstr "" @@ -2902,6 +2931,10 @@ msgstr "" msgid "Manage collections" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:14 +msgid "Manage the collections on this device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" msgstr "" @@ -2984,8 +3017,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1001 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" @@ -3056,27 +3089,20 @@ msgstr "" msgid "Ctrl+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 -msgid "Preferences" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:34 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure before calibre is restarted." msgstr "" @@ -3152,11 +3178,11 @@ msgstr "" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed information is available for books on the device." msgstr "" @@ -3260,35 +3286,35 @@ msgstr "" msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:342 msgid "The add books process seems to have hung. Try restarting calibre and adding the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:358 msgid "Books with the same title as the following already exist in the database. Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:361 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:428 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:481 msgid "Saved" msgstr "" @@ -3370,26 +3396,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -#: /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:370 -#: /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:395 -#: /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:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 +#: /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:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /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:398 #: /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:406 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156 @@ -3405,6 +3430,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 @@ -3443,7 +3475,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 msgid "Formats" @@ -3469,7 +3501,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "None" msgstr "" @@ -3522,7 +3554,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 @@ -3541,9 +3573,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "" @@ -3836,13 +3871,17 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47 msgid "&Inline TOC" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:33 +msgid "Sectionize Chapters (Use with care!)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 msgid "Font rescaling wizard" msgstr "" @@ -4077,7 +4116,7 @@ msgid " is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /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:400 msgid "Book Cover" msgstr "" @@ -4086,28 +4125,27 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /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:401 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 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:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "&Author(s): " msgstr "" @@ -4120,39 +4158,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:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "&Publisher: " 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:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "Ta&gs: " 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:169 -#: /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:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 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:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /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:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "&Series:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "List of known series. You can add new series." 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "Book " msgstr "" @@ -4626,7 +4664,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:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 msgid "Automatically number books in this series" msgstr "" @@ -4779,7 +4817,7 @@ msgid "Attached, you will find the e-book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "" @@ -5031,247 +5069,255 @@ msgstr "" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 msgid "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 msgid "" "\n" "Customization: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 msgid "General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "Interface" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 msgid "" "Email\n" "Delivery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 msgid "Add/Save" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 msgid "" "Content\n" "Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:205 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:235 msgid "If checked, downloaded news will be automatically mailed
to this email address (provided it is in one of the listed formats)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:309 msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 msgid "Wide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 msgid "Narrow" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 msgid "Medium" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 msgid "Small" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Large" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 msgid "Always" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 msgid "Automatic" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:529 +msgid "Toolbars/Context menus" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:543 msgid "Done" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 msgid "Confirmation dialogs have all been reset" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:549 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 msgid "The value %d you have chosen for the content server port is a system port. Your operating system may not allow the server to run on this port. To be safe choose a port number larger than 1024." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:573 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 msgid "If you move calibre.app, you have to re-install the command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:626 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:630 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:642 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:661 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:699 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:715 msgid "Invalid tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 msgid "The tweaks you entered are invalid, try resetting the tweaks to default and changing them one by one until you find the invalid setting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:746 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:751 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 msgid "Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:820 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:827 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:852 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:855 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:944 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:947 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:948 msgid "The changes you made require that Calibre be restarted. Please restart as soon as practical." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:979 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:982 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:999 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1002 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1007 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1008 msgid "The following books had formats listed in the database that are not actually available. The entries for the formats have been removed. You should check them manually. This can happen if you manipulate the files in the library folder directly." msgstr "" @@ -5386,334 +5432,366 @@ msgstr "" msgid "Sending to &device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:128 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:127 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:126 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:131 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:132 msgid "Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:133 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:134 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:135 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Reset all disabled &confirmation dialogs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -msgid "Use &Roman numerals for series number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -msgid "Show ¬ifications in system tray" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -msgid "Use internal &viewer for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 +msgid "&Number of covers to show in browse mode (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Restriction to apply when the current library is opened:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "Apply this restriction on calibre startup if the current library is being used. Also applied when switching to this library. Note that this setting is per library. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 msgid "Disable all animations. Useful if you have a slow/old computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 msgid "Disable &animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -msgid "Show &donate button (restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 msgid "&Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 msgid "&Icon size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 msgid "Show &text under icons:" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 +msgid "&Delete news from library when it is automatically sent to reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 +msgid "Edit settings of a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 +msgid "Use internal &viewer for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 +msgid "Search as you type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 +msgid "Use &Roman numerals for series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 +msgid "Enable system &tray icon (needs restart)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:129 +msgid "Automatically send downloaded &news to ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +msgid "Show &splash screen at startup" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -msgid "Add an email address to which to send books" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 +msgid "Show cover &browser in a separate window (needs restart)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "&Add email" +msgid "Show ¬ifications in system tray" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -msgid "calibre can send your books to you (or your reader) by email. Emails will be automatically sent for downloaded news to all email addresses that have Auto-send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 msgid "&Miscellaneous" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 +msgid "Add an email address to which to send books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 +msgid "&Add email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 +msgid "Make &default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 +msgid "&Remove email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 +msgid "calibre can send your books to you (or your reader) by email. Emails will be automatically sent for downloaded news to all email addresses that have Auto-send checked." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 +msgid "&Maximum number of waiting worker processes (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 +msgid "Limit the max. simultaneous jobs to the available CPU &cores" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 +msgid "Debug &device detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 +msgid "&Check database integrity" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre" +msgid "Open calibre &configuration directory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "&Current tweaks" +msgid "&Install command line tools" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "&Restore to defaults" +msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "&Tweaks" +msgid "All available tweaks" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "calibre contains a network server that allows you to access your book collection using a browser from anywhere in the world. Any changes to the settings will only take effect after a server restart." +msgid "&Current tweaks" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "Server &port:" +msgid "&Restore to defaults" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 +msgid "&Tweaks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 +msgid "calibre contains a network server that allows you to access your book collection using a browser from anywhere in the world. Any changes to the settings will only take effect after a server restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 +msgid "Server &port:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 msgid "&Username:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 msgid "&Password:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 msgid "If you leave the password blank, anyone will be able to access your book collection using the web interface." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 msgid "The maximum size (widthxheight) for displayed covers. Larger covers are resized. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "&Show password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 msgid "Max. &OPDS items per query:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 msgid "Max. OPDS &ungrouped items:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 msgid "Restriction (saved search) to apply:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 msgid "This restriction (based on a saved search) will restrict the books the content server makes available to those matching the search. This setting is per library (i.e. you can have a different restriction per library)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 msgid "St&op Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 msgid "&Test Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 msgid "Run server &automatically on startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 msgid "View &server logs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 msgid "" "

Remember to leave calibre running as the server only runs as long as calibre is running.\n" "

Stanza should see your calibre collection automatically. If not, try adding the URL http://myhostname:8080 as a new catalog in the Stanza reader on your iPhone. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 msgid "Here you can customize the behavior of Calibre by controlling what plugins it uses." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 msgid "&Customize plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 msgid "&Remove plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 msgid "&Add" msgstr "" @@ -5965,63 +6043,87 @@ msgstr "" msgid "Downloading social metadata, please wait..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:35 +msgid "Switch between library and device views" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:38 msgid "Separator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:51 msgid "Choose library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:201 msgid "The main toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:202 msgid "The main toolbar when a device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:203 msgid "The context menu for the books in the calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:205 msgid "The context menu for the books on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94 -msgid "Customize the actions in:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:243 +msgid "Cannot add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95 -msgid "A&vailable actions" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:244 +msgid "Cannot add the actions %s to this location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 -msgid "&Current actions" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:261 +msgid "Cannot remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:262 +msgid "Cannot remove the actions %s from this location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Move selected action up" +msgid "Customize the actions in:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 +msgid "A&vailable actions" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 +msgid "&Current actions" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 +msgid "Move selected action up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 msgid "Move selected action down" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 msgid "Add selected actions to toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:107 msgid "Remove selected actions from toolbar" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:109 +msgid "Restore to &default" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 msgid "&Show this warning again" msgstr "" @@ -6172,76 +6274,84 @@ msgstr "" msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 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:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 +#: /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:372 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 #: /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 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 msgid "Comma separated list of tags to remove from the books. " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -msgid "Remove &format:" +msgid "Remove all" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +msgid "Check this box to remove all tags from the books." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +msgid "Remove &format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6249,24 +6359,24 @@ 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:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 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:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:192 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Custom metadata" msgstr "" @@ -6406,87 +6516,91 @@ msgstr "" 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:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 msgid "Meta information" 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:363 msgid "Swap the author and title" msgstr "" -#: /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:366 msgid "Author S&ort: " msgstr "" -#: /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:368 msgid "Automatically create the author sort entry based on the current author entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Publishe&d:" 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:388 msgid "dd MMM yyyy" msgstr "" -#: /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:389 msgid "&Date:" 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:390 msgid "&Comments" 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:391 msgid "&Fetch metadata from server" msgstr "" -#: /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:392 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "Add a new format for this book to the database" 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:395 msgid "Remove the selected formats for this book from the database." 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:397 msgid "Set the cover for the book from the selected format" 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:399 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /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:402 +msgid "&Browse" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Reset cover to default" msgstr "" -#: /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:405 msgid "Download &cover" msgstr "" -#: /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:406 msgid "Generate a default cover based on the title and author" 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:407 msgid "&Generate cover" msgstr "" @@ -7184,48 +7298,48 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:97 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 msgid "Shift+Alt+B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:116 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:139 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:212 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:222 msgid "Shift+Alt+D" msgstr "" @@ -7292,74 +7406,74 @@ msgstr "" msgid " - Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:53 msgid "Eject this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 msgid "Show books in calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Show books in the main memory of the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 #: /home/kovid/work/calibre/src/calibre/library/database2.py:598 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 msgid "Show books in storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 #: /home/kovid/work/calibre/src/calibre/library/database2.py:600 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 msgid "Show books in storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 msgid "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:140 msgid "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:153 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:162 msgid "

Search the list of books by title, author, publisher, tags, comments, etc.

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:169 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Delete current saved search" msgstr "" @@ -7664,9 +7778,23 @@ msgstr "" msgid "No matches found for this book" msgstr "" +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:77 +msgid "Here you can re-arrange the layout of the columns in the calibre library book list. You can hide columns by unchecking them. You can also create your own, custom columns." +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 +msgid "Add &custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 +msgid "Disable ¬ifications in system tray" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:562 msgid "Search" msgstr "" @@ -7881,59 +8009,59 @@ msgstr "" 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:165 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 msgid "

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:427 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 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:504 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 msgid "" " is communicating with the device!
\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:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" @@ -8401,47 +8529,47 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:246 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:247 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:372 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:373 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:374 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:375 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:376 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:838 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:846 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:881 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:888 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 msgid "Toggle" msgstr "" @@ -9472,63 +9600,63 @@ msgstr "" msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:663 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:696 msgid "Path to the database in which books are stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:665 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:698 msgid "Pattern to guess metadata from filenames" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:667 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:700 msgid "Access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:669 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 msgid "Default timeout for network operations (seconds)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:671 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:704 msgid "Path to directory in which your library of books is stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:673 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:706 msgid "The language in which to display the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:675 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:708 msgid "The default output format for ebook conversions." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:679 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:712 msgid "Ordered list of formats to prefer for input." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:681 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:714 msgid "Read metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:683 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:716 msgid "The priority of worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:685 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:718 msgid "Swap author first and last names when reading metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:687 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:720 msgid "Add new formats to existing book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:692 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:725 msgid "List of named saved searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:693 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:726 msgid "User-created tag browser categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:695 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:728 msgid "How and when calibre updates metadata on the device." msgstr "" diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index 432018e9b3..a890d653b6 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -13,14 +13,12 @@ from optparse import OptionParser as _OptionParser from optparse import IndentedHelpFormatter from collections import defaultdict -from calibre.constants import terminal_controller, config_dir, \ +from calibre.constants import terminal_controller, config_dir, CONFIG_DIR_MODE, \ __appname__, __version__, __author__ from calibre.utils.lock import LockError, ExclusiveFile plugin_dir = os.path.join(config_dir, 'plugins') -CONFIG_DIR_MODE = 0700 - def make_config_dir(): if not os.path.exists(plugin_dir): os.makedirs(plugin_dir, mode=CONFIG_DIR_MODE) diff --git a/src/calibre/web/feeds/templates.py b/src/calibre/web/feeds/templates.py index eb31b541e8..6e8168be31 100644 --- a/src/calibre/web/feeds/templates.py +++ b/src/calibre/web/feeds/templates.py @@ -193,12 +193,14 @@ class NavBarTemplate(Template): navbar = DIV(CLASS('calibre_navbar', 'calibre_rescale_70', style='text-align:'+align)) if bottom: - navbar.append(HR()) - text = 'This article was downloaded by ' - p = PT(text, STRONG(__appname__), A(url, href=url), style='text-align:left') - p[0].tail = ' from ' - navbar.append(p) - navbar.append(BR()) + if not url.startswith('file://'): + navbar.append(HR()) + text = 'This article was downloaded by ' + p = PT(text, STRONG(__appname__), A(url, href=url), + style='text-align:left; max-width: 100%; overflow: hidden;') + p[0].tail = ' from ' + navbar.append(p) + navbar.append(BR()) navbar.append(BR()) else: next = 'feed_%d'%(feed+1) if art == number_of_articles_in_feed - 1 \