diff --git a/Changelog.yaml b/Changelog.yaml index c5eadc5e65..a25b52bfbf 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -19,6 +19,117 @@ # new recipes: # - title: +- version: 0.7.49 + date: 2011-03-11 + + new features: + - title: "News download: More flexible news downlaod scheduling. You can now schedule by days of the week, days of the month and an interval, which can be as small as an hour for news sources that change rapidly" + + - title: "Improved support for dragging and dropping cover images directly from web browsers into calibre." + description: > + "You can drop the images onto the cover in calibre and it will be replaced. Tested on a number of OS/browser combinations, but I am sure there a still a few for which it wont work." + + - title: "Add shortcuts of Alt+Left and Alt+Right for the next and previous buttons in the edit metadata dialog." + tickets: [9360] + + - title: "When adding a GUI plugin, prompt the user for where the plugin should be displayed" + + - title: "Conversion: When using the Level x Table of Contents options, support the case when the level 1,2,3 items are spread over multiple HTML files." + + - title: "Support for the Optimus V" + + - title: "FB2 Input: Support for tables" + tickets: [9302] + + - title: "Display a checkmark/cross next to 'true' and 'false' items in custom columns. Controlled via Preferences->Add a custom column" + + - title: "Catalog generation: Reuse cover from existing catalog, allows the use of a custom cover for catalogs" + + - title: "When setting covers in calibre, resize to fit within a maximum size of (1200, 1600), to prevent slowdowns due to extra large covers. This size can be controlled via Preferences->Tweaks." + tickets: [9277] + + bug fixes: + - title: "Fix long standing bug that caused errors when saving books to disk if the book metadata has certain chinese/russian characters on windows. The fix required some changes to how unicode paths are handled in calibre, so it might have broken something else. If so, please open a ticket." + tickets: [7250] + + - title: "Custom recipes: Store custom recipes in the calibre config directory instead of the library database. This allows scheduling of custom recipes to work with multiple libraries. Note that you may have to re-schedule any existing custom recipes." + + - title: "Restore the ability to do search and replace on ISBN. Use the 'identifiers' field with type isbn to do this" + + - title: "Fix amazon metadata download plugin not working with ISBN-13 and social metadata not downloading if the supplied ISBN 10 is not for an edition available on Amazon" + + - title: "Workaround for openlibrary blocking the user agent used by calibre, preventing cover downloads from that site" + + - title: "FB2 Output: Add sequence to metadata. Fix bugs with author names. Fix bug where elements were put inside

tags." + + - title: "Conversion pipeline: If the input HTML document uses uppercase tag and attribute names, convert them to lowercase" + + - title: "RTF Input: Fix space after unicode quote character being incorrectly removed" + tickets: [9343] + + - title: "Fix regression that broke the ebook-device command line program in the previous release" + + - title: "Fix custom columns with numbers not allowing entry of positive numbers of 64-bit machines" + tickets: [9283] + + - title: "Fix regression that caused focus to be lost when editing metadata in the device view" + tickets: [9323] + + - title: "CHM Input: If an input encoding is specified, use it rather than trying to detect the encoding of the text in the CHM file." + tickets: [9173] + + - title: "Fix regression that caused the viewer to forget its window size and other attributes when launched from within calibre, after calibre is restarted." + tickets: [9326] + + - title: "News download: Fix regression that caused the delay parameter in recipes to not actually delay downloads." + tickets: [9332] + + - title: "Conversion pipeline: When converting the :first-letter pseudo CSS selector to a follow W3C rules for handling leading punctuation characters." + tickets: [9319] + + - title: "Fix regression that caused clicking saved searches in the Tag Browser to not work" + + - title: "Comic Input: Fix conversion failing when output profile is set to Tablet Output" + + - title: "Replace leading periods in all path components generated by calibre with underscores" + + - title: "Search and replace preferences: Prevent very long strings from causing the wizard button to get pushed off the screen" + + - title: "Content server: Fix regression that caused various metadata to be missing in the book details view." + ticckets: [8929] + + - title: "Apple driver: Ignore invalid EPUBs when sending to iTunes" + + improved recipes: + - golem.de + - gulli.de + - La Nacion + - Ming Pao + - evz.ro + - Kompiuterra + - NRC Handelsblad (EPUB) + - The Leduc - Wetaskiwin Pipestone Flyer + + new recipes: + - title: "Various Romanian news sources" + author: Silviu Cotoara + + - title: "Salt Lake City Tribune" + author: Charles Holbert + + - title: "Bay Citizen and Oakland North" + author: noah + + - title: "Nikkei Business and JB Press" + author: Ado Nishimura + + - title: "El Pais Babelia" + author: oneillpt + + - title: "Komchadluek" + author: ballsai + + - version: 0.7.48 date: 2011-03-04 diff --git a/resources/images/news/avantaje.png b/resources/images/news/avantaje.png new file mode 100644 index 0000000000..79f83c2665 Binary files /dev/null and b/resources/images/news/avantaje.png differ diff --git a/resources/images/news/cotidianul.png b/resources/images/news/cotidianul.png new file mode 100644 index 0000000000..2e57dbde54 Binary files /dev/null and b/resources/images/news/cotidianul.png differ diff --git a/resources/images/news/ele.png b/resources/images/news/ele.png new file mode 100644 index 0000000000..82f66b5caa Binary files /dev/null and b/resources/images/news/ele.png differ diff --git a/resources/images/news/felicia.png b/resources/images/news/felicia.png new file mode 100644 index 0000000000..4bc1fd35d8 Binary files /dev/null and b/resources/images/news/felicia.png differ diff --git a/resources/images/news/financiarul.png b/resources/images/news/financiarul.png new file mode 100644 index 0000000000..1d91a72a34 Binary files /dev/null and b/resources/images/news/financiarul.png differ diff --git a/resources/images/news/hitro.png b/resources/images/news/hitro.png new file mode 100644 index 0000000000..75c08a1c25 Binary files /dev/null and b/resources/images/news/hitro.png differ diff --git a/resources/images/news/imperatortravel.png b/resources/images/news/imperatortravel.png new file mode 100644 index 0000000000..c459759ed0 Binary files /dev/null and b/resources/images/news/imperatortravel.png differ diff --git a/resources/images/news/kamikaze.png b/resources/images/news/kamikaze.png new file mode 100644 index 0000000000..49ef2f50a1 Binary files /dev/null and b/resources/images/news/kamikaze.png differ diff --git a/resources/images/news/kompiutierra.png b/resources/images/news/kompiutierra.png new file mode 100644 index 0000000000..272e3d905f Binary files /dev/null and b/resources/images/news/kompiutierra.png differ diff --git a/resources/images/news/monden.png b/resources/images/news/monden.png new file mode 100644 index 0000000000..fcf8ad42ae Binary files /dev/null and b/resources/images/news/monden.png differ diff --git a/resources/images/news/onemagazine.png b/resources/images/news/onemagazine.png new file mode 100644 index 0000000000..61ce048c30 Binary files /dev/null and b/resources/images/news/onemagazine.png differ diff --git a/resources/images/news/pcworldro.png b/resources/images/news/pcworldro.png new file mode 100644 index 0000000000..532548302d Binary files /dev/null and b/resources/images/news/pcworldro.png differ diff --git a/resources/images/news/promotor.png b/resources/images/news/promotor.png new file mode 100644 index 0000000000..a479cf135b Binary files /dev/null and b/resources/images/news/promotor.png differ diff --git a/resources/images/news/protvmagazin.png b/resources/images/news/protvmagazin.png new file mode 100644 index 0000000000..8824760edb Binary files /dev/null and b/resources/images/news/protvmagazin.png differ diff --git a/resources/images/news/psychologies.png b/resources/images/news/psychologies.png new file mode 100644 index 0000000000..027296dde2 Binary files /dev/null and b/resources/images/news/psychologies.png differ diff --git a/resources/images/news/publika.png b/resources/images/news/publika.png new file mode 100644 index 0000000000..696a9b42a0 Binary files /dev/null and b/resources/images/news/publika.png differ diff --git a/resources/images/news/rbc_ru.png b/resources/images/news/rbc_ru.png new file mode 100644 index 0000000000..46c5d3fdce Binary files /dev/null and b/resources/images/news/rbc_ru.png differ diff --git a/resources/images/news/timesnewroman.png b/resources/images/news/timesnewroman.png new file mode 100644 index 0000000000..6ba02939b4 Binary files /dev/null and b/resources/images/news/timesnewroman.png differ diff --git a/resources/images/news/trombon.png b/resources/images/news/trombon.png new file mode 100644 index 0000000000..641b04f1b7 Binary files /dev/null and b/resources/images/news/trombon.png differ diff --git a/resources/images/news/tvmania.png b/resources/images/news/tvmania.png new file mode 100644 index 0000000000..022267f885 Binary files /dev/null and b/resources/images/news/tvmania.png differ diff --git a/resources/images/news/viva.png b/resources/images/news/viva.png new file mode 100644 index 0000000000..e01fc6125e Binary files /dev/null and b/resources/images/news/viva.png differ diff --git a/resources/images/news/wallstreetro.png b/resources/images/news/wallstreetro.png new file mode 100644 index 0000000000..d72bc70ca0 Binary files /dev/null and b/resources/images/news/wallstreetro.png differ diff --git a/resources/recipes/avantaje.recipe b/resources/recipes/avantaje.recipe new file mode 100644 index 0000000000..9a48616fa1 --- /dev/null +++ b/resources/recipes/avantaje.recipe @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +avantaje.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Avantaje(BasicNewsRecipe): + title = u'Avantaje' + __author__ = u'Silviu Cotoar\u0103' + description = u'' + publisher = u'Avantaje' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Stiri' + encoding = 'utf-8' + cover_url = 'http://www.avantaje.ro/images/default/logo.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'id':'articol'}) + , dict(name='div', attrs={'class':'gallery clearfix'}) + , dict(name='div', attrs={'align':'justify'}) + ] + + remove_tags = [ + dict(name='div', attrs={'id':['color_sanatate_box']}) + , dict(name='div', attrs={'class':['nav']}) + , dict(name='div', attrs={'class':['voteaza_art']}) + , dict(name='div', attrs={'class':['bookmark']}) + , dict(name='div', attrs={'class':['links clearfix']}) + , dict(name='div', attrs={'class':['title']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['title']}) + ] + + feeds = [ + (u'Feeds', u'http://feeds.feedburner.com/Avantaje') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/bay_citizen.recipe b/resources/recipes/bay_citizen.recipe new file mode 100644 index 0000000000..e6a6c2b63d --- /dev/null +++ b/resources/recipes/bay_citizen.recipe @@ -0,0 +1,46 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class TheBayCitizen(BasicNewsRecipe): + title = 'The Bay Citizen' + language = 'en' + __author__ = 'noah' + description = 'The Bay Citizen' + publisher = 'The Bay Citizen' + INDEX = u'http://www.baycitizen.org' + category = 'news' + oldest_article = 2 + max_articles_per_feed = 20 + no_stylesheets = True + masthead_url = 'http://media.baycitizen.org/images/layout/logo1.png' + feeds = [('Main Feed', 'http://www.baycitizen.org/feeds/stories/')] + keep_only_tags = [dict(name='div', attrs={'class':'story'})] + remove_tags = [ + dict(name='div', attrs={'class':'socialBar'}), + dict(name='div', attrs={'id':'text-resize'}), + dict(name='div', attrs={'class':'story relatedContent'}), + dict(name='div', attrs={'id':'comment_status_loading'}), + ] + + def append_page(self, soup, appendtag, position): + pager = soup.find('a',attrs={'class':'stry-next'}) + if pager: + nexturl = self.INDEX + pager['href'] + soup2 = self.index_to_soup(nexturl) + texttag = soup2.find('div', attrs={'class':'body'}) + for it in texttag.findAll(style=True): + del it['style'] + newpos = len(texttag.contents) + self.append_page(soup2,texttag,newpos) + texttag.extract() + appendtag.insert(position,texttag) + + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + self.append_page(soup, soup.body, 3) + garbage = soup.findAll(id='story-pagination') + [trash.extract() for trash in garbage] + garbage = soup.findAll('em', 'cont-from-prev') + [trash.extract() for trash in garbage] + return soup diff --git a/resources/recipes/cotidianul.recipe b/resources/recipes/cotidianul.recipe new file mode 100644 index 0000000000..f00196532c --- /dev/null +++ b/resources/recipes/cotidianul.recipe @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +cotidianul.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Cotidianul(BasicNewsRecipe): + title = u'Cotidianul' + __author__ = u'Silviu Cotoar\u0103' + description = u'' + publisher = u'Cotidianul' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri' + encoding = 'utf-8' + cover_url = 'http://www.cotidianul.ro/images/cotidianul.png' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'titlu'}) + , dict(name='div', attrs={'class':'gallery clearfix'}) + , dict(name='div', attrs={'align':'justify'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['space']}) + , dict(name='div', attrs={'id':['title_desc']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['space']}) + , dict(name='span', attrs={'class':['date']}) + ] + + feeds = [ + (u'Feeds', u'http://www.cotidianul.ro/rssfeed/ToateStirile.xml') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/economist.recipe b/resources/recipes/economist.recipe index 17bf4c8c20..9447fe2193 100644 --- a/resources/recipes/economist.recipe +++ b/resources/recipes/economist.recipe @@ -24,7 +24,7 @@ class Economist(BasicNewsRecipe): cover_url = 'http://www.economist.com/images/covers/currentcoverus_large.jpg' remove_tags = [ dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent']), - dict(attrs={'class':['dblClkTrk', 'ec-article-info']}), + dict(attrs={'class':['dblClkTrk', 'ec-article-info', 'share_inline_header']}), {'class': lambda x: x and 'share-links-header' in x}, ] keep_only_tags = [dict(id='ec-article-body')] diff --git a/resources/recipes/economist_free.recipe b/resources/recipes/economist_free.recipe index f4a4efd932..d1766211d7 100644 --- a/resources/recipes/economist_free.recipe +++ b/resources/recipes/economist_free.recipe @@ -18,7 +18,8 @@ class Economist(BasicNewsRecipe): cover_url = 'http://www.economist.com/images/covers/currentcoverus_large.jpg' remove_tags = [ dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent']), - dict(attrs={'class':['dblClkTrk', 'ec-article-info']}), + dict(attrs={'class':['dblClkTrk', 'ec-article-info', + 'share_inline_header']}), {'class': lambda x: x and 'share-links-header' in x}, ] keep_only_tags = [dict(id='ec-article-body')] diff --git a/resources/recipes/el_pais_babelia.recipe b/resources/recipes/el_pais_babelia.recipe new file mode 100644 index 0000000000..31b983ec0b --- /dev/null +++ b/resources/recipes/el_pais_babelia.recipe @@ -0,0 +1,49 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class ElPaisBabelia(BasicNewsRecipe): + + title = 'El Pais Babelia' + __author__ = 'oneillpt' + description = 'El Pais Babelia' + INDEX = 'http://www.elpais.com/suple/babelia/' + language = 'es' + + remove_tags_before = dict(name='div', attrs={'class':'estructura_2col'}) + keep_tags = [dict(name='div', attrs={'class':'estructura_2col'})] + remove_tags = [dict(name='div', attrs={'class':'votos estirar'}), + dict(name='div', attrs={'id':'utilidades'}), + dict(name='div', attrs={'class':'info_relacionada'}), + dict(name='div', attrs={'class':'mod_apoyo'}), + dict(name='div', attrs={'class':'contorno_f'}), + dict(name='div', attrs={'class':'pestanias'}), + dict(name='div', attrs={'class':'otros_webs'}), + dict(name='div', attrs={'id':'pie'}) + ] + #no_stylesheets = True + remove_javascript = True + + def parse_index(self): + articles = [] + soup = self.index_to_soup(self.INDEX) + feeds = [] + for section in soup.findAll('div', attrs={'class':'contenedor_nuevo'}): + section_title = self.tag_to_string(section.find('h1')) + articles = [] + for post in section.findAll('a', href=True): + url = post['href'] + if url.startswith('/'): + url = 'http://www.elpais.es'+url + title = self.tag_to_string(post) + if str(post).find('class=') > 0: + klass = post['class'] + if klass != "": + self.log() + self.log('--> post: ', post) + self.log('--> url: ', url) + self.log('--> title: ', title) + self.log('--> class: ', klass) + articles.append({'title':title, 'url':url}) + if articles: + feeds.append((section_title, articles)) + return feeds + diff --git a/resources/recipes/ele.recipe b/resources/recipes/ele.recipe new file mode 100644 index 0000000000..ea8954366b --- /dev/null +++ b/resources/recipes/ele.recipe @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +ele.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Ele(BasicNewsRecipe): + title = u'Ele' + __author__ = u'Silviu Cotoar\u0103' + description = u'Dezv\u0103luie ceea ce e\u015fti' + publisher = u'Ele' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Femei' + encoding = 'utf-8' + cover_url = 'http://www.tripmedia.ro/tripadmin/photos/logo_ele_mare.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='h1', attrs={'class':'article_title'}) + , dict(name='div', attrs={'class':'article_text'}) + ] + + feeds = [ + (u'Feeds', u'http://www.ele.ro/rss_must_read') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/evz.ro.recipe b/resources/recipes/evz.ro.recipe index bce151d1fc..841dc80429 100644 --- a/resources/recipes/evz.ro.recipe +++ b/resources/recipes/evz.ro.recipe @@ -1,52 +1,54 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + __license__ = 'GPL v3' -__copyright__ = '2010, Darko Miletic ' +__copyright__ = u'2011, Silviu Cotoar\u0103' ''' evz.ro ''' -import re from calibre.web.feeds.news import BasicNewsRecipe -class EVZ_Ro(BasicNewsRecipe): - title = 'evz.ro' - __author__ = 'Darko Miletic' - description = 'News from Romania' - publisher = 'evz.ro' - category = 'news, politics, Romania' - oldest_article = 2 - max_articles_per_feed = 200 - no_stylesheets = True - encoding = 'utf8' - use_embedded_content = False +class EvenimentulZilei(BasicNewsRecipe): + title = u'Evenimentul Zilei' + __author__ = u'Silviu Cotoar\u0103' + description = '' + publisher = u'Evenimentul Zilei' + oldest_article = 5 language = 'ro' - masthead_url = 'http://www.evz.ro/fileadmin/images/logo.gif' - extra_css = ' body{font-family: Georgia,Arial,Helvetica,sans-serif } .firstP{font-size: 1.125em} .author,.articleInfo{font-size: small} ' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri' + encoding = 'utf-8' + cover_url = 'http://www.evz.ro/fileadmin/images/evzLogo.png' conversion_options = { - 'comment' : description - , 'tags' : category - , 'publisher' : publisher - , 'language' : language - } + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } - preprocess_regexps = [ - (re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '<head><title>') - ,(re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '') - ] + keep_only_tags = [ + dict(name='div', attrs={'class':'single'}) + , dict(name='img', attrs={'id':'placeholder'}) + , dict(name='a', attrs={'id':'holderlink'}) + ] - remove_tags = [ - dict(name=['form','embed','iframe','object','base','link','script','noscript']) - ,dict(attrs={'class':['section','statsInfo','email il']}) - ,dict(attrs={'id' :'gallery'}) - ] + remove_tags = [ + dict(name='p', attrs={'class':['articleInfo']}) + , dict(name='div', attrs={'id':['bannerAddoceansArticleJos']}) + , dict(name='div', attrs={'id':['bannerAddoceansArticle']}) + ] - remove_tags_after = dict(attrs={'class':'section'}) - keep_only_tags = [dict(attrs={'class':'single'})] - remove_attributes = ['height','width'] + remove_tags_after = [ + dict(name='div', attrs={'id':['bannerAddoceansArticleJos']}) + ] - feeds = [(u'Articles', u'http://www.evz.ro/rss.xml')] + feeds = [ + (u'Feeds', u'http://www.evz.ro/rss.xml') + ] def preprocess_html(self, soup): - for item in soup.findAll(style=True): - del item['style'] - return soup + return self.adeify_images(soup) diff --git a/resources/recipes/felicia.recipe b/resources/recipes/felicia.recipe new file mode 100644 index 0000000000..0772e38494 --- /dev/null +++ b/resources/recipes/felicia.recipe @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +revistafelicia.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Felicia(BasicNewsRecipe): + title = u'Revista Felicia' + __author__ = u'Silviu Cotoar\u0103' + description = u'O revist\u0103 pentru sufletul t\u0103u' + publisher = u'Revista Felicia' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste' + encoding = 'utf-8' + cover_url = 'http://www.3waves.net/uploads/image/logo-revista-felicia_03.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'class':'header'}) + , dict(name='div', attrs={'id':'contentArticol'}) + ] + + remove_tags = [ + dict(name='img',attrs={'src':['http://www.revistafelicia.ro/templates/default/images/hdr_ultimul_nr.jpg']}) + , dict(name='div',attrs={'class':['content']}) + ] + + feeds = [ + (u'Feeds', u'http://www.revistafelicia.ro/rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/financiarul.recipe b/resources/recipes/financiarul.recipe new file mode 100644 index 0000000000..807f771408 --- /dev/null +++ b/resources/recipes/financiarul.recipe @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +financiarul.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Financiarul(BasicNewsRecipe): + title = u'Financiarul' + __author__ = u'Silviu Cotoar\u0103' + description = u'FIN.ro' + publisher = u'Financiarul' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri' + encoding = 'utf-8' + cover_url = 'http://www.financiarul.com/templates/default/images/logo.png' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'class':'col2ContentLeftL'}) + ] + + remove_tags = [ + dict(name='div',attrs={'class':['infoArticol']}) + , dict(name='ul', attrs={'class':'navSectiuni'}) + , dict(name='div', attrs={'class':'separator separatorTop'}) + , dict(name='div', attrs={'class':'infoArticol infoArticolBottom'}) + , dict(name='ul', attrs={'class':['related']}) + , dict(name='div', attrs={'class':['slot panel300 panelGri300 panelGri300s panelGri300sm']}) + ] + + remove_tags_after = [ + dict(name='ul', attrs={'class':['related']}) + ] + + feeds = [ + (u'Feeds', u'http://www.financiarul.com/rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/golem_de.recipe b/resources/recipes/golem_de.recipe index d0280a9617..77374cb162 100644 --- a/resources/recipes/golem_de.recipe +++ b/resources/recipes/golem_de.recipe @@ -1,17 +1,83 @@ -from calibre.web.feeds.news import BasicNewsRecipe +#!/usr/bin/env python -class AdvancedUserRecipe1257093338(BasicNewsRecipe): +from calibre.web.feeds.news import BasicNewsRecipe +class golem_ger(BasicNewsRecipe): title = u'Golem.de' language = 'de' __author__ = 'Kovid Goyal' oldest_article = 7 max_articles_per_feed = 100 + language = 'de' + lang = 'de-DE' + no_stylesheets = True + encoding = 'iso-8859-1' + recursions = 1 + match_regexps = [r'http://www.golem.de/.*.html'] - feeds = [(u'Golem.de', u'http://rss.golem.de/rss.php?feed=ATOM1.0')] + keep_only_tags = [ + dict(name='h1', attrs={'class':'artikelhead'}), + dict(name='p', attrs={'class':'teaser'}), + dict(name='div', attrs={'class':'artikeltext'}), + dict(name='h2', attrs={'id':'artikelhead'}), + ] - def print_version(self, url): - murxb = url.rfind('/') + 1 - murxc = url[murxb :-5] - murxa = 'http://www.golem.de/' + 'print.php?a=' + murxc - return murxa + + remove_tags = [ + dict(name='div', attrs={'id':['similarContent','topContentWrapper','storycarousel','aboveFootPromo','comments','toolbar','breadcrumbs','commentlink','sidebar','rightColumn']}), + dict(name='div', attrs={'class':['gg_embeddedSubText','gg_embeddedIndex gg_solid','gg_toOldGallery','golemGallery']}), + dict(name='img', attrs={'class':['gg_embedded','gg_embeddedIconRight gg_embeddedIconFS gg_cursorpointer']}), + dict(name='td', attrs={'class':['xsmall']}), + ] + + + # remove_tags_after = [ + # dict(name='div', attrs={'id':['contentad2']}) + # ] + + + feeds = [ + (u'Golem.de', u'http://rss.golem.de/rss.php?feed=ATOM1.0'), + (u'Audio/Video', u'http://rss.golem.de/rss.php?tp=av&feed=RSS2.0'), + (u'Foto', u'http://rss.golem.de/rss.php?tp=foto&feed=RSS2.0'), + (u'Games', u'http://rss.golem.de/rss.php?tp=games&feed=RSS2.0'), + (u'Internet', u'http://rss.golem.de/rss.php?tp=inet&feed=RSS1.0'), + (u'Mobil', u'http://rss.golem.de/rss.php?tp=mc&feed=ATOM1.0'), + (u'Internet', u'http://rss.golem.de/rss.php?tp=inet&feed=RSS1.0'), + (u'Politik/Recht', u'http://rss.golem.de/rss.php?tp=pol&feed=ATOM1.0'), + (u'Desktop-Applikationen', u'http://rss.golem.de/rss.php?tp=apps&feed=RSS2.0'), + (u'Software-Entwicklung', u'http://rss.golem.de/rss.php?tp=dev&feed=RSS2.0'), + (u'Wirtschaft', u'http://rss.golem.de/rss.php?tp=wirtschaft&feed=RSS2.0'), + (u'Hardware', u'http://rss.golem.de/rss.php?r=hw&feed=RSS2.0'), + (u'Software', u'http://rss.golem.de/rss.php?r=sw&feed=RSS2.0'), + (u'Networld', u'http://rss.golem.de/rss.php?r=nw&feed=RSS2.0'), + (u'Entertainment', u'http://rss.golem.de/rss.php?r=et&feed=RSS2.0'), + (u'TK', u'http://rss.golem.de/rss.php?r=tk&feed=RSS2.0'), + (u'E-Commerce', u'http://rss.golem.de/rss.php?r=ec&feed=RSS2.0'), + (u'Unternehmen/Maerkte', u'http://rss.golem.de/rss.php?r=wi&feed=RSS2.0') + ] + + + + + feeds = [ + (u'Golem.de', u'http://rss.golem.de/rss.php?feed=ATOM1.0'), + (u'Mobil', u'http://rss.golem.de/rss.php?tp=mc&feed=feed=RSS2.0'), + (u'OSS', u'http://rss.golem.de/rss.php?tp=oss&feed=RSS2.0'), + (u'Politik/Recht', u'http://rss.golem.de/rss.php?tp=pol&feed=RSS2.0'), + (u'Desktop-Applikationen', u'http://rss.golem.de/rss.php?tp=apps&feed=RSS2.0'), + (u'Software-Entwicklung', u'http://rss.golem.de/rss.php?tp=dev&feed=RSS2.0'), + ] + + + extra_css = ''' + h1 {color:#0066CC;font-family:Arial,Helvetica,sans-serif; font-size:30px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:20px;margin-bottom:2 em;} + h2 {color:#4D4D4D;font-family:Arial,Helvetica,sans-serif; font-size:22px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:16px; } + h3 {color:#4D4D4D;font-family:Arial,Helvetica,sans-serif; font-size:x-small; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:normal; line-height:5px;} + h4 {color:#333333; font-family:Arial,Helvetica,sans-serif;font-size:13px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:13px; } + h5 {color:#333333; font-family:Arial,Helvetica,sans-serif; font-size:11px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:11px; text-transform:uppercase;} + .teaser {font-style:italic;font-size:12pt;margin-bottom:15pt;} + .xsmall{font-style:italic;font-size:x-small;} + .td{font-style:italic;font-size:x-small;} + img {align:left;} + ''' diff --git a/resources/recipes/gulli.recipe b/resources/recipes/gulli.recipe index e695aa02ef..8a861f527f 100644 --- a/resources/recipes/gulli.recipe +++ b/resources/recipes/gulli.recipe @@ -11,6 +11,26 @@ class AdvancedUserRecipe1259599587(BasicNewsRecipe): feeds = [(u'gulli:news', u'http://ticker.gulli.com/rss/')] - remove_tags = [{'class' : ['addthis_button', 'BreadCrumb']}, {'id' : ['plista0']}] + remove_tags = [dict(name='div', attrs={'class':['FloatL','_forumBox']})] - keep_only_tags = [dict(name='div', attrs={'class':'inside'})] + keep_only_tags = [dict(name='div', attrs={'id':['_contentLeft']})] + + remove_tags_after = [dict(name='div', attrs={'class':['_bookmark']})] + + + + + + extra_css = ''' + h1 {color:#008852;font-family:Arial,Helvetica,sans-serif; font-size:25px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:22px; } + h2 {color:#4D4D4D;font-family:Arial,Helvetica,sans-serif; font-size:18px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:16px; } + h3 {color:#4D4D4D;font-family:Arial,Helvetica,sans-serif; font-size:15px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:14px;} + h4 {color:#333333; font-family:Arial,Helvetica,sans-serif;font-size:12px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:14px; } + h5 {color:#333333; font-family:Arial,Helvetica,sans-serif; font-size:11px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:bold; line-height:14px; text-transform:uppercase;} + .newsdate {color:#333333;font-family:Arial,Helvetica,sans-serif;font-size:10px; font-size-adjust:none; font-stretch:normal; font-style:italic; font-variant:normal; font-weight:bold; line-height:10px; text-decoration:none;} + .articleInfo {color:#4D4D4D;font-family:Arial,Helvetica,sans-serif;font-size:10px; font-size-adjust:none; font-stretch:normal; font-style:bold; font-variant:normal; font-weight:bold; line-height:10px; text-decoration:none;} + .byline {color:#666;margin-bottom:0;font-size:12px} + .blockquote {color:#030303;font-style:italic;padding-left:15px;} + img {align:center;} + .li {list-style-type: none} + ''' diff --git a/resources/recipes/hitro.recipe b/resources/recipes/hitro.recipe new file mode 100644 index 0000000000..3a85847c81 --- /dev/null +++ b/resources/recipes/hitro.recipe @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +hit.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Hit(BasicNewsRecipe): + title = u'HIT' + __author__ = u'Silviu Cotoar\u0103' + description = 'IT' + publisher = 'HIT' + oldest_article = 5 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,IT' + encoding = 'utf-8' + cover_url = 'http://www.hit.ro/lib/images/frontend/hit_logo.png' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='h1', attrs={'class':'art_titl'}) + , dict(name='div', attrs={'id':'continut_articol'}) + ] + + feeds = [ + (u'Feeds', u'http://www.hit.ro/rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/imperatortravel.recipe b/resources/recipes/imperatortravel.recipe new file mode 100644 index 0000000000..2b6d323bf5 --- /dev/null +++ b/resources/recipes/imperatortravel.recipe @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +imperatortravel.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Imperatortravel(BasicNewsRecipe): + title = u'Imperator Travel' + __author__ = u'Silviu Cotoar\u0103' + description = u'C\u0103l\u0103torii' + publisher = u'Imperator Travel' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri,Turism,Calatorii' + encoding = 'utf-8' + cover_url = 'http://www.imperatortravel.ro/images/header-1.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'article first_main_article'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['meta']}) + , dict(name='body', attrs={'class':['transparent_widget ff3 win Locale_en_US']}) + , dict(name='div', attrs={'class':['connect_widget']}) + , dict(name='ul', attrs={'class':['similar-posts']}) + ] + + remove_tags_after = [ + dict(name='ul', attrs={'class':['similar-posts']}) + ] + + feeds = [ + (u'Feeds', u'http://feeds.feedburner.com/ImperatorTravels') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/jbpress.recipe b/resources/recipes/jbpress.recipe new file mode 100644 index 0000000000..acfb1c78d6 --- /dev/null +++ b/resources/recipes/jbpress.recipe @@ -0,0 +1,42 @@ +import urllib2 +from calibre.web.feeds.news import BasicNewsRecipe + +class JBPress(BasicNewsRecipe): + title = u'JBPress' + language = 'ja' + description = u'Japan Business Press New articles (using small print version)' + __author__ = 'Ado Nishimura' + needs_subscription = True + oldest_article = 7 + max_articles_per_feed = 100 + remove_tags_before = dict(id='wrapper') + no_stylesheets = True + + feeds = [('JBPress new article', 'http://feed.ismedia.jp/rss/jbpress/all.rdf')] + + + def get_cover_url(self): + return 'http://www.jbpress.co.jp/common/images/v1/jpn/common/logo.gif' + + def get_browser(self): + html = '''

+ + + +
+''' + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://jbpress.ismedia.jp/articles/print/5549') + response = br.response() + response.set_data(html) + br.set_response(response) + br.select_form(nr=0) + br["login"] = self.username + br['password'] = self.password + br.submit() + return br + + def print_version(self, url): + url = urllib2.urlopen(url).geturl() # resolve redirect. + return url.replace('/-/', '/print/') diff --git a/resources/recipes/kamikaze.recipe b/resources/recipes/kamikaze.recipe new file mode 100644 index 0000000000..1369cb6f85 --- /dev/null +++ b/resources/recipes/kamikaze.recipe @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +kamikazeonline.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Kamikaze(BasicNewsRecipe): + title = u'Kamikaze' + __author__ = u'Silviu Cotoar\u0103' + description = u'S\u0103pt\u0103m\u00e2nal sc\u0103pat de sub control' + publisher = 'Kamikaze' + oldest_article = 5 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste' + encoding = 'utf-8' + cover_url = 'http://www.kamikazeonline.ro/wp-content/themes/kamikaze/images/kamikazeonline_header.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'id':'content'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['connect_confirmation_cell connect_confirmation_cell_no_like']}) + , dict(name='h3', attrs={'id':['comments']}) + , dict(name='ul', attrs={'class':['addtoany_list']}) + , dict(name='p', attrs={'class':['postmetadata']}) + ] + + remove_tags_after = [ + dict(name='p', attrs={'class':['postmetadata']}) + ] + + feeds = [ + (u'Feeds', u'http://www.kamikazeonline.ro/feed/') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/komchadluek.recipe b/resources/recipes/komchadluek.recipe new file mode 100644 index 0000000000..5f0d2f58a2 --- /dev/null +++ b/resources/recipes/komchadluek.recipe @@ -0,0 +1,46 @@ +from calibre.web.feeds.recipes import BasicNewsRecipe + +class KomChadLuek(BasicNewsRecipe): + + title= 'KomChadLuek' + description = 'Komchadluek News' + __author__ = 'ballsaii and Chotechai' + __license__ = 'GPL v3' + publisher= 'Nation Media Group' + category = 'news, Thai' + language = 'th' + + oldest_article = 1 + max_articles_per_feed = 100 + no_stylesheets= True + remove_javascript=True + + cover_url = 'http://www.komchadluek.net/images_layout2/komchadluek_headerlogo.png' + + keep_only_tags = [] + keep_only_tags.append(dict(name = 'h2')) + keep_only_tags.append(dict(name = 'div', attrs={'id':'news_detail_news'})) + + remove_tags_after=[dict(name='hr')] + + feeds =( +(u'\u0e01\u0e32\u0e23\u0e40\u0e21\u0e37\u0e2d\u0e07','http://www.komchadluek.net/rss/politic.xml'), +(u'\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28','http://www.komchadluek.net/rss/sport.xml'), +(u'\u0e40\u0e01\u0e29\u0e15\u0e23','http://www.komchadluek.net/rss/agriculture.xml'), +(u'\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28','http://www.komchadluek.net/rss/foreign.xml'), +(u'\u0e1a\u0e31\u0e19\u0e40\u0e17\u0e34\u0e07','http://www.komchadluek.net/rss/entertainment.xml'), +(u'\u0e1c\u0e39\u0e49\u0e2b\u0e0d\u0e34\u0e07-\u0e41\u0e1f\u0e0a\u0e31\u0e48\u0e19','http://www.komchadluek.net/rss/fashion.xml'), +(u'\u0e1e\u0e23\u0e30\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07','http://www.komchadluek.net/rss/amulet.xml'), +(u'\u0e20\u0e39\u0e21\u0e34\u0e20\u0e32\u0e04-\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e04\u0e21\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19','http://www.komchadluek.net/rss/local.xml'), +(u'\u0e25\u0e38\u0e07\u0e41\u0e08\u0e48\u0e21','http://www.komchadluek.net/rss/unclecham.xml'), +(u'\u0e44\u0e25\u0e1f\u0e4c\u0e2a\u0e44\u0e15\u0e25\u0e4c','http://www.komchadluek.net/rss/lifestyle.xml'), +(u'\u0e40\u0e28\u0e23\u0e29\u0e10\u0e01\u0e34\u0e08-\u0e01\u0e32\u0e23\u0e15\u0e25\u0e32\u0e14','http://www.komchadluek.net/rss/economic.xml'), +(u'\u0e2d\u0e32\u0e2b\u0e32\u0e23','http://www.komchadluek.net/rss/food.xml'), +(u'\u0e04\u0e19\u0e23\u0e31\u0e01\u0e1a\u0e49\u0e32\u0e19-\u0e22\u0e32\u0e19\u0e22\u0e19\u0e15\u0e4c','http://www.komchadluek.net/rss/homecar.xml'), +(u'\u0e14\u0e39\u0e14\u0e27\u0e07-\u0e42\u0e2b\u0e23\u0e32\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c','http://www.komchadluek.net/rss/horoscope.xml'), +(u'\u0e27\u0e34\u0e17\u0e22\u0e4c\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c-\u0e44\u0e2d\u0e17\u0e35','http://www.komchadluek.net/rss/scienceit.xml'), +(u'\u0e28\u0e32\u0e2a\u0e19\u0e32 \u0e28\u0e34\u0e25\u0e1b\u0e30-\u0e27\u0e31\u0e12\u0e19\u0e18\u0e23\u0e23\u0e21 \u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e2a\u0e38\u0e02','http://www.komchadluek.net/rss/artculture.xml'), +(u'\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32', 'http://www.komchadluek.net/rss/education.xml'), +(u'\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21','http://www.komchadluek.net/rss/article.xml'), +(u'\u0e2d\u0e32\u0e0a\u0e0d\u0e32\u0e01\u0e23\u0e23\u0e21', 'http://www.komchadluek.net/rss/crime.xml') +) diff --git a/resources/recipes/kompiutierra.recipe b/resources/recipes/kompiutierra.recipe index 0d30afa3a7..a82db9aced 100644 --- a/resources/recipes/kompiutierra.recipe +++ b/resources/recipes/kompiutierra.recipe @@ -1,36 +1,37 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = '2010, Vadim Dyadkin, dyadkin@gmail.com' -__author__ = 'Vadim Dyadkin' - -from calibre.web.feeds.news import BasicNewsRecipe - -class Computerra(BasicNewsRecipe): - title = u'\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0440\u0430' - recursion = 50 - oldest_article = 100 - __author__ = 'Vadim Dyadkin' - max_articles_per_feed = 100 - use_embedded_content = False - simultaneous_downloads = 5 - language = 'ru' - description = u'\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b, \u043e\u043a\u043e\u043b\u043e\u043d\u0430\u0443\u0447\u043d\u044b\u0435 \u0438 \u043e\u043a\u043e\u043b\u043e\u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0433\u0430\u0434\u0436\u0435\u0442\u044b.' - - keep_only_tags = [dict(name='div', attrs={'id': 'content'}),] - - - feeds = [(u'\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0440\u0430', 'http://feeds.feedburner.com/ct_news/'),] - - remove_tags = [dict(name='div', attrs={'id': ['fin', 'idc-container', 'idc-noscript',]}), - dict(name='ul', attrs={'class': "related_post"}), - dict(name='p', attrs={'class': 'info'}), - dict(name='a', attrs={'rel': 'tag', 'class': 'twitter-share-button', 'type': 'button_count'}), - dict(name='h2', attrs={}),] - - extra_css = 'body { text-align: justify; }' - - def get_article_url(self, article): - return article.get('feedburner:origLink', article.get('guid')) - +#!/usr/bin/python +# -*- coding: utf-8 -*- + +__license__ = 'GPL v3' +__copyright__ = '2010, Vadim Dyadkin, dyadkin@gmail.com' +__author__ = 'Vadim Dyadkin' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Computerra(BasicNewsRecipe): + title = u'\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0440\u0430' + oldest_article = 100 + __author__ = 'Vadim Dyadkin (edited by A. Chewi)' + max_articles_per_feed = 50 + use_embedded_content = False + remove_javascript = True + no_stylesheets = True + conversion_options = {'linearize_tables' : True} + simultaneous_downloads = 5 + language = 'ru' + description = u'Компьютерра: все новости про компьютеры, железо, новые технологии, информационные технологии' + + keep_only_tags = [dict(name='div', attrs={'id': 'content'}),] + + feeds = [(u'Компьютерра-Онлайн', 'http://feeds.feedburner.com/ct_news/'),] + + remove_tags = [ + dict(name='div', attrs={'id': ['fin', 'idc-container', 'idc-noscript',]}), + dict(name='ul', attrs={'class': "related_post"}), + dict(name='p', attrs={'class': 'info'}), + dict(name='a', attrs={'class': 'twitter-share-button'}), + dict(name='a', attrs={'type': 'button_count'}), + dict(name='h2', attrs={}) + ] + + def print_version(self, url): + return url + '?print=true' diff --git a/resources/recipes/lanacion.recipe b/resources/recipes/lanacion.recipe index 05e777ec67..cdee0e5e66 100644 --- a/resources/recipes/lanacion.recipe +++ b/resources/recipes/lanacion.recipe @@ -1,5 +1,5 @@ __license__ = 'GPL v3' -__copyright__ = '2008-2010, Darko Miletic ' +__copyright__ = '2008-2011, Darko Miletic ' ''' lanacion.com.ar ''' @@ -17,14 +17,16 @@ class Lanacion(BasicNewsRecipe): use_embedded_content = False no_stylesheets = True language = 'es_AR' + delay = 14 publication_type = 'newspaper' remove_empty_feeds = True - masthead_url = 'http://www.lanacion.com.ar/imgs/layout/logos/ln341x47.gif' - extra_css = """ h1{font-family: Georgia,serif} - h2{color: #626262} + masthead_url = 'http://www.lanacion.com.ar/_ui/desktop/imgs/layout/logos/ln341x47.gif' + extra_css = """ + h1{font-family: Georgia,serif} + h2{color: #626262; font-weight: normal; font-size: 1.1em} body{font-family: Arial,sans-serif} img{margin-top: 0.5em; margin-bottom: 0.2em; display: block} - .notaFecha{color: #808080} + .notaFecha{color: #808080; font-size: small} .notaEpigrafe{font-size: x-small} .topNota h1{font-family: Arial,sans-serif} """ @@ -37,47 +39,75 @@ class Lanacion(BasicNewsRecipe): , 'language' : language } - keep_only_tags = [dict(name='div', attrs={'class':['nota floatFix','topNota','nota','post']})] + keep_only_tags = [ + dict(name='div', attrs={'class':['topNota','itemHeader','nota','itemBody']}) + ,dict(name='div', attrs={'id':'content'}) + ] + remove_tags = [ dict(name='div' , attrs={'class':'notaComentario floatFix noprint' }) ,dict(name='ul' , attrs={'class':['cajaHerramientas cajaTop noprint','herramientas noprint']}) - ,dict(name='div' , attrs={'class':['cajaHerramientas noprint','cajaHerramientas floatFix'] }) - ,dict(attrs={'class':['titulosMultimedia','derecha','techo color','encuesta','izquierda compartir','floatFix','videoCentro']}) + ,dict(name='div' , attrs={'class':['titulosMultimedia','herramientas noprint','cajaHerramientas noprint','cajaHerramientas floatFix'] }) + ,dict(attrs={'class':['izquierda','espacio17','espacio10','espacio20','floatFix ultimasNoticias','relacionadas','titulosMultimedia','derecha','techo color','encuesta','izquierda compartir','floatFix','videoCentro']}) ,dict(name=['iframe','embed','object','form','base','hr','meta','link','input']) ] + remove_tags_after = dict(attrs={'class':['tags','nota-destacado']}) remove_attributes = ['height','width','visible','onclick','data-count','name'] feeds = [ - (u'Ultimas noticias' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?origen=2' ) - ,(u'Politica' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=30' ) - ,(u'Economia' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=272' ) - ,(u'Deportes' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=131' ) - ,(u'Informacion General' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=21' ) - ,(u'Cultura' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=1' ) - ,(u'Opinion' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=28' ) - ,(u'Espectaculos' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=120' ) - ,(u'Exterior' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=7' ) - ,(u'Ciencia&Salud' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=498' ) - ,(u'Revista' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=494' ) - ,(u'Enfoques' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=421' ) - ,(u'Comercio Exterior' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=347' ) - ,(u'Tecnologia' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=432' ) - ,(u'Arquitectura' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=366' ) - ,(u'Turismo' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=504' ) - ,(u'Al volante' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=371' ) - ,(u'El Campo' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=337' ) - ,(u'Moda y Belleza' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=1312' ) - ,(u'Inmuebles Comerciales', u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=1363' ) - ,(u'Countries' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=1348' ) - ,(u'adnCultura' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=6734' ) - ,(u'The Wall Street Journal Americas', u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=6373' ) - ,(u'Estilo de vida' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=7353' ) - ,(u'Management' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=7380' ) - ,(u'Bicentenario' , u'http://www.lanacion.com.ar/herramientas/rss/index.asp?categoria_id=7276' ) + (u'Politica' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=30' ) + ,(u'Deportes' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=131' ) + ,(u'Economia' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=272' ) + ,(u'Informacion General' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=21' ) + ,(u'Cultura' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=1' ) + ,(u'Opinion' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=28' ) + ,(u'Espectaculos' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=120' ) + ,(u'Exterior' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=7' ) + ,(u'Ciencia&Salud' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=498' ) + ,(u'Revista' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=494' ) + ,(u'Enfoques' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=421' ) + ,(u'Comercio Exterior' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=347' ) + ,(u'Tecnologia' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=432' ) + ,(u'Arquitectura' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=366' ) + ,(u'Turismo' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=504' ) + ,(u'Al volante' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=371' ) + ,(u'El Campo' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=337' ) + ,(u'Moda y Belleza' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=1312') + ,(u'Inmuebles Comerciales', u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=1363') + ,(u'Countries' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=1348') + ,(u'adnCultura' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=6734') + ,(u'The WSJ Americas' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=6373') + ,(u'Comunidad' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=1344') + ,(u'Management' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=7380') + ,(u'Bicentenario' , u'http://servicios.lanacion.com.ar/herramientas/rss/categoria_id=7276') ] + + def get_article_url(self, article): + link = BasicNewsRecipe.get_article_url(self,article) + if link.startswith('http://blogs.lanacion') and not link.endswith('/'): + return self.browser.open_novisit(link).geturl() + if link.rfind('galeria=') > 0: + return None + return link + def preprocess_html(self, soup): for item in soup.findAll(style=True): del item['style'] - return self.adeify_images(soup) + for item in soup.findAll('a'): + limg = item.find('img') + if item.string is not None: + str = item.string + item.replaceWith(str) + else: + if limg: + item.name = 'div' + item.attrs = [] + else: + str = self.tag_to_string(item) + item.replaceWith(str) + for item in soup.findAll('img'): + if not item.has_key('alt'): + item['alt'] = 'image' + return soup diff --git a/resources/recipes/ming_pao.recipe b/resources/recipes/ming_pao.recipe index bbdbbf7ace..4a405a59dd 100644 --- a/resources/recipes/ming_pao.recipe +++ b/resources/recipes/ming_pao.recipe @@ -1,7 +1,20 @@ __license__ = 'GPL v3' __copyright__ = '2010-2011, Eddie Lau' + +# Users of Kindle 3 (with limited system-level CJK support) +# please replace the following "True" with "False". +__MakePeriodical__ = True +# Turn it to True if your device supports display of CJK titles +__UseChineseTitle__ = False + + ''' Change Log: +2011/03/06: add new articles for finance section, also a new section "Columns" +2011/02/28: rearrange the sections + [Disabled until Kindle has better CJK support and can remember last (section,article) read in Sections & Articles + View] make it the same title if generating a periodical, so past issue will be automatically put into "Past Issues" + folder in Kindle 3 2011/02/20: skip duplicated links in finance section, put photos which may extend a whole page to the back of the articles clean up the indentation 2010/12/07: add entertainment section, use newspaper front page as ebook cover, suppress date display in section list @@ -19,55 +32,58 @@ import os, datetime, re from calibre.web.feeds.recipes import BasicNewsRecipe from contextlib import nested - from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.metadata import MetaInformation class MPHKRecipe(BasicNewsRecipe): - IsCJKWellSupported = True # Set to False to avoid generating periodical in which CJK characters can't be displayed in section/article view - title = 'Ming Pao - Hong Kong' - oldest_article = 1 - max_articles_per_feed = 100 - __author__ = 'Eddie Lau' - description = ('Hong Kong Chinese Newspaper (http://news.mingpao.com). If' - 'you are using a Kindle with firmware < 3.1, customize the' - 'recipe') - publisher = 'MingPao' - category = 'Chinese, News, Hong Kong' - remove_javascript = True - use_embedded_content = False - no_stylesheets = True - language = 'zh' - encoding = 'Big5-HKSCS' - recursions = 0 - conversion_options = {'linearize_tables':True} - timefmt = '' - extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px;} font>b {font-size:200%; font-weight:bold;}' - masthead_url = 'http://news.mingpao.com/image/portals_top_logo_news.gif' - keep_only_tags = [dict(name='h1'), + title = 'Ming Pao - Hong Kong' + oldest_article = 1 + max_articles_per_feed = 100 + __author__ = 'Eddie Lau' + description = 'Hong Kong Chinese Newspaper (http://news.mingpao.com)' + publisher = 'MingPao' + category = 'Chinese, News, Hong Kong' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'zh' + encoding = 'Big5-HKSCS' + recursions = 0 + conversion_options = {'linearize_tables':True} + timefmt = '' + extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px;} font>b {font-size:200%; font-weight:bold;}' + masthead_url = 'http://news.mingpao.com/image/portals_top_logo_news.gif' + keep_only_tags = [dict(name='h1'), dict(name='font', attrs={'style':['font-size:14pt; line-height:160%;']}), # for entertainment page title - dict(attrs={'id':['newscontent']}), # entertainment page content + dict(name='font', attrs={'color':['AA0000']}), # for column articles title + dict(attrs={'id':['newscontent']}), # entertainment and column page content dict(attrs={'id':['newscontent01','newscontent02']}), dict(attrs={'class':['photo']}) ] - remove_tags = [dict(name='style'), - dict(attrs={'id':['newscontent135']})] # for the finance page - remove_attributes = ['width'] - preprocess_regexps = [ + remove_tags = [dict(name='style'), + dict(attrs={'id':['newscontent135']}), # for the finance page + dict(name='table')] # for content fetched from life.mingpao.com + remove_attributes = ['width'] + preprocess_regexps = [ (re.compile(r'
', re.DOTALL|re.IGNORECASE), lambda match: '

'), (re.compile(r'

', re.DOTALL|re.IGNORECASE), lambda match: ''), (re.compile(r'

', re.DOTALL|re.IGNORECASE), # for entertainment page - lambda match: '') + lambda match: ''), + # skip
after title in life.mingpao.com fetched article + (re.compile(r"

", re.DOTALL|re.IGNORECASE), + lambda match: "
"), + (re.compile(r"

", re.DOTALL|re.IGNORECASE), + lambda match: "") ] - def image_url_processor(cls, baseurl, url): - # trick: break the url at the first occurance of digit, add an additional - # '_' at the front - # not working, may need to move this to preprocess_html() method + def image_url_processor(cls, baseurl, url): + # trick: break the url at the first occurance of digit, add an additional + # '_' at the front + # not working, may need to move this to preprocess_html() method # minIdx = 10000 # i0 = url.find('0') # if i0 >= 0 and i0 < minIdx: @@ -99,253 +115,314 @@ class MPHKRecipe(BasicNewsRecipe): # i9 = url.find('9') # if i9 >= 0 and i9 < minIdx: # minIdx = i9 - return url + return url - def get_dtlocal(self): - dt_utc = datetime.datetime.utcnow() - # convert UTC to local hk time - at around HKT 6.00am, all news are available - dt_local = dt_utc - datetime.timedelta(-2.0/24) - return dt_local + def get_dtlocal(self): + dt_utc = datetime.datetime.utcnow() + # convert UTC to local hk time - at around HKT 6.00am, all news are available + dt_local = dt_utc - datetime.timedelta(-2.0/24) + return dt_local - def get_fetchdate(self): - return self.get_dtlocal().strftime("%Y%m%d") + def get_fetchdate(self): + return self.get_dtlocal().strftime("%Y%m%d") - def get_fetchformatteddate(self): - return self.get_dtlocal().strftime("%Y-%m-%d") + def get_fetchformatteddate(self): + return self.get_dtlocal().strftime("%Y-%m-%d") - def get_fetchday(self): - # convert UTC to local hk time - at around HKT 6.00am, all news are available - return self.get_dtlocal().strftime("%d") + def get_fetchday(self): + # convert UTC to local hk time - at around HKT 6.00am, all news are available + return self.get_dtlocal().strftime("%d") - def get_cover_url(self): - cover = 'http://news.mingpao.com/' + self.get_fetchdate() + '/' + self.get_fetchdate() + '_' + self.get_fetchday() + 'gacov.jpg' - br = BasicNewsRecipe.get_browser() - try: - br.open(cover) - except: - cover = None - return cover + def get_cover_url(self): + cover = 'http://news.mingpao.com/' + self.get_fetchdate() + '/' + self.get_fetchdate() + '_' + self.get_fetchday() + 'gacov.jpg' + br = BasicNewsRecipe.get_browser() + try: + br.open(cover) + except: + cover = None + return cover - def parse_index(self): - feeds = [] - dateStr = self.get_fetchdate() - for title, url in [(u'\u8981\u805e Headline', 'http://news.mingpao.com/' + dateStr + '/gaindex.htm'), - (u'\u6e2f\u805e Local', 'http://news.mingpao.com/' + dateStr + '/gbindex.htm'), - (u'\u793e\u8a55/\u7b46\u9663 Editorial', 'http://news.mingpao.com/' + dateStr + '/mrindex.htm'), - (u'\u8ad6\u58c7 Forum', 'http://news.mingpao.com/' + dateStr + '/faindex.htm'), + def parse_index(self): + feeds = [] + dateStr = self.get_fetchdate() + + for title, url in [(u'\u8981\u805e Headline', 'http://news.mingpao.com/' + dateStr + '/gaindex.htm'), + (u'\u6e2f\u805e Local', 'http://news.mingpao.com/' + dateStr + '/gbindex.htm'), + (u'\u6559\u80b2 Education', 'http://news.mingpao.com/' + dateStr + '/gfindex.htm')]: + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) + + # special- editorial + ed_articles = self.parse_ed_section('http://life.mingpao.com/cfm/dailynews2.cfm?Issue=' + dateStr +'&Category=nalmr') + if ed_articles: + feeds.append((u'\u793e\u8a55/\u7b46\u9663 Editorial', ed_articles)) + + for title, url in [(u'\u8ad6\u58c7 Forum', 'http://news.mingpao.com/' + dateStr + '/faindex.htm'), (u'\u4e2d\u570b China', 'http://news.mingpao.com/' + dateStr + '/caindex.htm'), - (u'\u570b\u969b World', 'http://news.mingpao.com/' + dateStr + '/taindex.htm'), - ('Tech News', 'http://news.mingpao.com/' + dateStr + '/naindex.htm'), - (u'\u6559\u80b2 Education', 'http://news.mingpao.com/' + dateStr + '/gfindex.htm'), - (u'\u9ad4\u80b2 Sport', 'http://news.mingpao.com/' + dateStr + '/spindex.htm'), - (u'\u526f\u520a Supplement', 'http://news.mingpao.com/' + dateStr + '/jaindex.htm'), + (u'\u570b\u969b World', 'http://news.mingpao.com/' + dateStr + '/taindex.htm')]: + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) + + # special - finance + #fin_articles = self.parse_fin_section('http://www.mpfinance.com/htm/Finance/' + dateStr + '/News/ea,eb,ecindex.htm') + fin_articles = self.parse_fin_section('http://life.mingpao.com/cfm/dailynews2.cfm?Issue=' + dateStr + '&Category=nalea') + if fin_articles: + feeds.append((u'\u7d93\u6fdf Finance', fin_articles)) + + for title, url in [('Tech News', 'http://news.mingpao.com/' + dateStr + '/naindex.htm'), + (u'\u9ad4\u80b2 Sport', 'http://news.mingpao.com/' + dateStr + '/spindex.htm')]: + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) + + # special - entertainment + ent_articles = self.parse_ent_section('http://ol.mingpao.com/cfm/star1.cfm') + if ent_articles: + feeds.append((u'\u5f71\u8996 Film/TV', ent_articles)) + + for title, url in [(u'\u526f\u520a Supplement', 'http://news.mingpao.com/' + dateStr + '/jaindex.htm'), (u'\u82f1\u6587 English', 'http://news.mingpao.com/' + dateStr + '/emindex.htm')]: - articles = self.parse_section(url) - if articles: - feeds.append((title, articles)) - # special - finance - fin_articles = self.parse_fin_section('http://www.mpfinance.com/htm/Finance/' + dateStr + '/News/ea,eb,ecindex.htm') - if fin_articles: - feeds.append((u'\u7d93\u6fdf Finance', fin_articles)) - # special - entertainment - ent_articles = self.parse_ent_section('http://ol.mingpao.com/cfm/star1.cfm') - if ent_articles: - feeds.append((u'\u5f71\u8996 Film/TV', ent_articles)) - return feeds + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) - def parse_section(self, url): - dateStr = self.get_fetchdate() - soup = self.index_to_soup(url) - divs = soup.findAll(attrs={'class': ['bullet','bullet_grey']}) - current_articles = [] - included_urls = [] - divs.reverse() - for i in divs: - a = i.find('a', href = True) - title = self.tag_to_string(a) - url = a.get('href', False) - url = 'http://news.mingpao.com/' + dateStr + '/' +url - if url not in included_urls and url.rfind('Redirect') == -1: - current_articles.append({'title': title, 'url': url, 'description':'', 'date':''}) - included_urls.append(url) - current_articles.reverse() - return current_articles - def parse_fin_section(self, url): - dateStr = self.get_fetchdate() - soup = self.index_to_soup(url) - a = soup.findAll('a', href= True) - current_articles = [] - included_urls = [] - for i in a: - url = 'http://www.mpfinance.com/cfm/' + i.get('href', False) - if url not in included_urls and not url.rfind(dateStr) == -1 and url.rfind('index') == -1: - title = self.tag_to_string(i) - current_articles.append({'title': title, 'url': url, 'description':''}) - included_urls.append(url) - return current_articles + # special- columns + col_articles = self.parse_col_section('http://life.mingpao.com/cfm/dailynews2.cfm?Issue=' + dateStr +'&Category=ncolumn') + if col_articles: + feeds.append((u'\u5c08\u6b04 Columns', col_articles)) - def parse_ent_section(self, url): - self.get_fetchdate() - soup = self.index_to_soup(url) - a = soup.findAll('a', href=True) - a.reverse() - current_articles = [] - included_urls = [] - for i in a: - title = self.tag_to_string(i) - url = 'http://ol.mingpao.com/cfm/' + i.get('href', False) - if (url not in included_urls) and (not url.rfind('.txt') == -1) and (not url.rfind('star') == -1): - current_articles.append({'title': title, 'url': url, 'description': ''}) - included_urls.append(url) - current_articles.reverse() - return current_articles + return feeds - def preprocess_html(self, soup): - for item in soup.findAll(style=True): - del item['style'] - for item in soup.findAll(style=True): - del item['width'] - for item in soup.findAll(stype=True): - del item['absmiddle'] - return soup + def parse_section(self, url): + dateStr = self.get_fetchdate() + soup = self.index_to_soup(url) + divs = soup.findAll(attrs={'class': ['bullet','bullet_grey']}) + current_articles = [] + included_urls = [] + divs.reverse() + for i in divs: + a = i.find('a', href = True) + title = self.tag_to_string(a) + url = a.get('href', False) + url = 'http://news.mingpao.com/' + dateStr + '/' +url + if url not in included_urls and url.rfind('Redirect') == -1: + current_articles.append({'title': title, 'url': url, 'description':'', 'date':''}) + included_urls.append(url) + current_articles.reverse() + return current_articles - def create_opf(self, feeds, dir=None): - if dir is None: - dir = self.output_dir - if self.IsCJKWellSupported == True: - # use Chinese title - title = u'\u660e\u5831 (\u9999\u6e2f) ' + self.get_fetchformatteddate() - else: - # use English title - title = self.short_title() + ' ' + self.get_fetchformatteddate() - if True: # force date in title - # title += strftime(self.timefmt) - mi = MetaInformation(title, [self.publisher]) - mi.publisher = self.publisher - mi.author_sort = self.publisher - if self.IsCJKWellSupported == True: - mi.publication_type = 'periodical:'+self.publication_type+':'+self.short_title() - else: - mi.publication_type = self.publication_type+':'+self.short_title() - #mi.timestamp = nowf() - mi.timestamp = self.get_dtlocal() - mi.comments = self.description - if not isinstance(mi.comments, unicode): - mi.comments = mi.comments.decode('utf-8', 'replace') - #mi.pubdate = nowf() - mi.pubdate = self.get_dtlocal() - opf_path = os.path.join(dir, 'index.opf') - ncx_path = os.path.join(dir, 'index.ncx') - opf = OPFCreator(dir, mi) - # Add mastheadImage entry to section - mp = getattr(self, 'masthead_path', None) - if mp is not None and os.access(mp, os.R_OK): - from calibre.ebooks.metadata.opf2 import Guide - ref = Guide.Reference(os.path.basename(self.masthead_path), os.getcwdu()) - ref.type = 'masthead' - ref.title = 'Masthead Image' - opf.guide.append(ref) + def parse_ed_section(self, url): + self.get_fetchdate() + soup = self.index_to_soup(url) + a = soup.findAll('a', href=True) + a.reverse() + current_articles = [] + included_urls = [] + for i in a: + title = self.tag_to_string(i) + url = 'http://life.mingpao.com/cfm/' + i.get('href', False) + if (url not in included_urls) and (not url.rfind('.txt') == -1) and (not url.rfind('nal') == -1): + current_articles.append({'title': title, 'url': url, 'description': ''}) + included_urls.append(url) + current_articles.reverse() + return current_articles - manifest = [os.path.join(dir, 'feed_%d'%i) for i in range(len(feeds))] - manifest.append(os.path.join(dir, 'index.html')) - manifest.append(os.path.join(dir, 'index.ncx')) + def parse_fin_section(self, url): + self.get_fetchdate() + soup = self.index_to_soup(url) + a = soup.findAll('a', href= True) + current_articles = [] + included_urls = [] + for i in a: + #url = 'http://www.mpfinance.com/cfm/' + i.get('href', False) + url = 'http://life.mingpao.com/cfm/' + i.get('href', False) + #if url not in included_urls and not url.rfind(dateStr) == -1 and url.rfind('index') == -1: + if url not in included_urls and (not url.rfind('txt') == -1) and (not url.rfind('nal') == -1): + title = self.tag_to_string(i) + current_articles.append({'title': title, 'url': url, 'description':''}) + included_urls.append(url) + return current_articles - # Get cover - cpath = getattr(self, 'cover_path', None) - if cpath is None: - pf = open(os.path.join(dir, 'cover.jpg'), 'wb') - if self.default_cover(pf): - cpath = pf.name - if cpath is not None and os.access(cpath, os.R_OK): - opf.cover = cpath - manifest.append(cpath) + def parse_ent_section(self, url): + self.get_fetchdate() + soup = self.index_to_soup(url) + a = soup.findAll('a', href=True) + a.reverse() + current_articles = [] + included_urls = [] + for i in a: + title = self.tag_to_string(i) + url = 'http://ol.mingpao.com/cfm/' + i.get('href', False) + if (url not in included_urls) and (not url.rfind('.txt') == -1) and (not url.rfind('star') == -1): + current_articles.append({'title': title, 'url': url, 'description': ''}) + included_urls.append(url) + current_articles.reverse() + return current_articles - # Get masthead - mpath = getattr(self, 'masthead_path', None) - if mpath is not None and os.access(mpath, os.R_OK): - manifest.append(mpath) + def parse_col_section(self, url): + self.get_fetchdate() + soup = self.index_to_soup(url) + a = soup.findAll('a', href=True) + a.reverse() + current_articles = [] + included_urls = [] + for i in a: + title = self.tag_to_string(i) + url = 'http://life.mingpao.com/cfm/' + i.get('href', False) + if (url not in included_urls) and (not url.rfind('.txt') == -1) and (not url.rfind('ncl') == -1): + current_articles.append({'title': title, 'url': url, 'description': ''}) + included_urls.append(url) + current_articles.reverse() + return current_articles - opf.create_manifest_from_files_in(manifest) - for mani in opf.manifest: - if mani.path.endswith('.ncx'): - mani.id = 'ncx' - if mani.path.endswith('mastheadImage.jpg'): - mani.id = 'masthead-image' - entries = ['index.html'] - toc = TOC(base_path=dir) - self.play_order_counter = 0 - self.play_order_map = {} + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for item in soup.findAll(style=True): + del item['width'] + for item in soup.findAll(stype=True): + del item['absmiddle'] + return soup - def feed_index(num, parent): - f = feeds[num] - for j, a in enumerate(f): - if getattr(a, 'downloaded', False): - adir = 'feed_%d/article_%d/'%(num, j) - auth = a.author - if not auth: - auth = None - desc = a.text_summary - if not desc: - desc = None - else: - desc = self.description_limiter(desc) - entries.append('%sindex.html'%adir) - po = self.play_order_map.get(entries[-1], None) - if po is None: - self.play_order_counter += 1 - po = self.play_order_counter - parent.add_item('%sindex.html'%adir, None, a.title if a.title else _('Untitled Article'), + def create_opf(self, feeds, dir=None): + if dir is None: + dir = self.output_dir + if __UseChineseTitle__ == True: + title = u'\u660e\u5831 (\u9999\u6e2f)' + else: + title = self.short_title() + # if not generating a periodical, force date to apply in title + if __MakePeriodical__ == False: + title = title + ' ' + self.get_fetchformatteddate() + if True: + mi = MetaInformation(title, [self.publisher]) + mi.publisher = self.publisher + mi.author_sort = self.publisher + if __MakePeriodical__ == True: + mi.publication_type = 'periodical:'+self.publication_type+':'+self.short_title() + else: + mi.publication_type = self.publication_type+':'+self.short_title() + #mi.timestamp = nowf() + mi.timestamp = self.get_dtlocal() + mi.comments = self.description + if not isinstance(mi.comments, unicode): + mi.comments = mi.comments.decode('utf-8', 'replace') + #mi.pubdate = nowf() + mi.pubdate = self.get_dtlocal() + opf_path = os.path.join(dir, 'index.opf') + ncx_path = os.path.join(dir, 'index.ncx') + opf = OPFCreator(dir, mi) + # Add mastheadImage entry to section + mp = getattr(self, 'masthead_path', None) + if mp is not None and os.access(mp, os.R_OK): + from calibre.ebooks.metadata.opf2 import Guide + ref = Guide.Reference(os.path.basename(self.masthead_path), os.getcwdu()) + ref.type = 'masthead' + ref.title = 'Masthead Image' + opf.guide.append(ref) + + manifest = [os.path.join(dir, 'feed_%d'%i) for i in range(len(feeds))] + manifest.append(os.path.join(dir, 'index.html')) + manifest.append(os.path.join(dir, 'index.ncx')) + + # Get cover + cpath = getattr(self, 'cover_path', None) + if cpath is None: + pf = open(os.path.join(dir, 'cover.jpg'), 'wb') + if self.default_cover(pf): + cpath = pf.name + if cpath is not None and os.access(cpath, os.R_OK): + opf.cover = cpath + manifest.append(cpath) + + # Get masthead + mpath = getattr(self, 'masthead_path', None) + if mpath is not None and os.access(mpath, os.R_OK): + manifest.append(mpath) + + opf.create_manifest_from_files_in(manifest) + for mani in opf.manifest: + if mani.path.endswith('.ncx'): + mani.id = 'ncx' + if mani.path.endswith('mastheadImage.jpg'): + mani.id = 'masthead-image' + entries = ['index.html'] + toc = TOC(base_path=dir) + self.play_order_counter = 0 + self.play_order_map = {} + + def feed_index(num, parent): + f = feeds[num] + for j, a in enumerate(f): + if getattr(a, 'downloaded', False): + adir = 'feed_%d/article_%d/'%(num, j) + auth = a.author + if not auth: + auth = None + desc = a.text_summary + if not desc: + desc = None + else: + desc = self.description_limiter(desc) + entries.append('%sindex.html'%adir) + po = self.play_order_map.get(entries[-1], None) + if po is None: + self.play_order_counter += 1 + po = self.play_order_counter + parent.add_item('%sindex.html'%adir, None, a.title if a.title else _('Untitled Article'), play_order=po, author=auth, description=desc) - last = os.path.join(self.output_dir, ('%sindex.html'%adir).replace('/', os.sep)) - for sp in a.sub_pages: - prefix = os.path.commonprefix([opf_path, sp]) - relp = sp[len(prefix):] - entries.append(relp.replace(os.sep, '/')) - last = sp + last = os.path.join(self.output_dir, ('%sindex.html'%adir).replace('/', os.sep)) + for sp in a.sub_pages: + prefix = os.path.commonprefix([opf_path, sp]) + relp = sp[len(prefix):] + entries.append(relp.replace(os.sep, '/')) + last = sp - if os.path.exists(last): - with open(last, 'rb') as fi: - src = fi.read().decode('utf-8') - soup = BeautifulSoup(src) - body = soup.find('body') - if body is not None: - prefix = '/'.join('..'for i in range(2*len(re.findall(r'link\d+', last)))) - templ = self.navbar.generate(True, num, j, len(f), + if os.path.exists(last): + with open(last, 'rb') as fi: + src = fi.read().decode('utf-8') + soup = BeautifulSoup(src) + body = soup.find('body') + if body is not None: + prefix = '/'.join('..'for i in range(2*len(re.findall(r'link\d+', last)))) + templ = self.navbar.generate(True, num, j, len(f), not self.has_single_feed, a.orig_url, self.publisher, prefix=prefix, center=self.center_navbar) - elem = BeautifulSoup(templ.render(doctype='xhtml').decode('utf-8')).find('div') - body.insert(len(body.contents), elem) - with open(last, 'wb') as fi: - fi.write(unicode(soup).encode('utf-8')) - if len(feeds) == 0: - raise Exception('All feeds are empty, aborting.') + elem = BeautifulSoup(templ.render(doctype='xhtml').decode('utf-8')).find('div') + body.insert(len(body.contents), elem) + with open(last, 'wb') as fi: + fi.write(unicode(soup).encode('utf-8')) + if len(feeds) == 0: + raise Exception('All feeds are empty, aborting.') - if len(feeds) > 1: - for i, f in enumerate(feeds): - entries.append('feed_%d/index.html'%i) - po = self.play_order_map.get(entries[-1], None) - if po is None: - self.play_order_counter += 1 - po = self.play_order_counter - auth = getattr(f, 'author', None) - if not auth: - auth = None - desc = getattr(f, 'description', None) - if not desc: - desc = None - feed_index(i, toc.add_item('feed_%d/index.html'%i, None, + if len(feeds) > 1: + for i, f in enumerate(feeds): + entries.append('feed_%d/index.html'%i) + po = self.play_order_map.get(entries[-1], None) + if po is None: + self.play_order_counter += 1 + po = self.play_order_counter + auth = getattr(f, 'author', None) + if not auth: + auth = None + desc = getattr(f, 'description', None) + if not desc: + desc = None + feed_index(i, toc.add_item('feed_%d/index.html'%i, None, f.title, play_order=po, description=desc, author=auth)) - else: - entries.append('feed_%d/index.html'%0) - feed_index(0, toc) + else: + entries.append('feed_%d/index.html'%0) + feed_index(0, toc) - for i, p in enumerate(entries): - entries[i] = os.path.join(dir, p.replace('/', os.sep)) - opf.create_spine(entries) - opf.set_toc(toc) + for i, p in enumerate(entries): + entries[i] = os.path.join(dir, p.replace('/', os.sep)) + opf.create_spine(entries) + opf.set_toc(toc) - with nested(open(opf_path, 'wb'), open(ncx_path, 'wb')) as (opf_file, ncx_file): - opf.render(opf_file, ncx_file) + with nested(open(opf_path, 'wb'), open(ncx_path, 'wb')) as (opf_file, ncx_file): + opf.render(opf_file, ncx_file) diff --git a/resources/recipes/monden.recipe b/resources/recipes/monden.recipe new file mode 100644 index 0000000000..22764ffe47 --- /dev/null +++ b/resources/recipes/monden.recipe @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +monden.info +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Monden(BasicNewsRecipe): + title = u'Monden' + __author__ = u'Silviu Cotoar\u0103' + description = u'Arti\u015fti, interviuri, concerte.. MUZIC\u0102' + publisher = u'Monden' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri,Muzica' + encoding = 'utf-8' + cover_url = 'http://www.monden.info/wp-content/uploads/2009/04/mondeninfo-logo.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'id':'content'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['postAuthor']}) + , dict(name='div', attrs={'class':['postLike']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['postLike']}) + ] + + feeds = [ + (u'Feeds', u'http://www.monden.info/feed/') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/nationalgeoro.recipe b/resources/recipes/nationalgeoro.recipe index a3c5727d38..8f989be74d 100644 --- a/resources/recipes/nationalgeoro.recipe +++ b/resources/recipes/nationalgeoro.recipe @@ -14,7 +14,7 @@ class NationalGeoRo(BasicNewsRecipe): __author__ = u'Silviu Cotoar\u0103' description = u'S\u0103 avem grij\u0103 de planet\u0103' publisher = 'National Geographic' - oldest_article = 5 + oldest_article = 35 language = 'ro' max_articles_per_feed = 100 no_stylesheets = True diff --git a/resources/recipes/nbonline.recipe b/resources/recipes/nbonline.recipe new file mode 100644 index 0000000000..c5a06edec7 --- /dev/null +++ b/resources/recipes/nbonline.recipe @@ -0,0 +1,33 @@ +EMAILADDRESS = 'hoge@foobar.co.jp' +from calibre.web.feeds.news import BasicNewsRecipe + + +class NBOnline(BasicNewsRecipe): + title = u'Nikkei Business Online' + language = 'ja' + description = u'Nikkei Business Online New articles. PLEASE NOTE: You need to edit EMAILADDRESS line of this "nbonline.recipe" file to set your e-mail address which is needed when login. (file is in "Calibre2/resources/recipes" directory.)' + __author__ = 'Ado Nishimura' + needs_subscription = True + oldest_article = 7 + max_articles_per_feed = 100 + remove_tags_before = dict(id='kanban') + remove_tags = [dict(name='div', id='footer')] + + feeds = [('Nikkei Buisiness Online', 'http://business.nikkeibp.co.jp/rss/all_nbo.rdf')] + + def get_cover_url(self): + return 'http://business.nikkeibp.co.jp/images/nbo/200804/parts/logo.gif' + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('https://signon.nikkeibp.co.jp/front/login/?ct=p&ts=nbo') + br.select_form(name='loginActionForm') + br['email'] = EMAILADDRESS + br['userId'] = self.username + br['password'] = self.password + br.submit() + return br + + def print_version(self, url): + return url + '?ST=print' diff --git a/resources/recipes/nrc-nl-epub.recipe b/resources/recipes/nrc-nl-epub.recipe index da9b9195ce..2d190e4d0a 100644 --- a/resources/recipes/nrc-nl-epub.recipe +++ b/resources/recipes/nrc-nl-epub.recipe @@ -1,14 +1,14 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 # -*- coding: utf-8 -*- -#Based on Lars Jacob's Taz Digiabo recipe +#Based on veezh's original recipe and Kovid Goyal's New York Times recipe __license__ = 'GPL v3' -__copyright__ = '2010, veezh' +__copyright__ = '2011, Snaab' ''' www.nrc.nl ''' -import os, urllib2, zipfile +import os, zipfile import time from calibre.web.feeds.news import BasicNewsRecipe from calibre.ptempfile import PersistentTemporaryFile @@ -17,41 +17,59 @@ from calibre.ptempfile import PersistentTemporaryFile class NRCHandelsblad(BasicNewsRecipe): title = u'NRC Handelsblad' - description = u'De EPUB-versie van NRC' + description = u'De ePaper-versie van NRC' language = 'nl' lang = 'nl-NL' + needs_subscription = True - __author__ = 'veezh' + __author__ = 'Snaab' conversion_options = { 'no_default_epub_cover' : True } + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://login.nrc.nl/login') + br.select_form(nr=0) + br['username'] = self.username + br['password'] = self.password + br.submit() + return br + def build_index(self): + today = time.strftime("%Y%m%d") + domain = "http://digitaleeditie.nrc.nl" url = domain + "/digitaleeditie/helekrant/epub/nrc_" + today + ".epub" -# print url + #print url try: - f = urllib2.urlopen(url) - except urllib2.HTTPError: + br = self.get_browser() + f = br.open(url) + except: self.report_progress(0,_('Kan niet inloggen om editie te downloaden')) raise ValueError('Krant van vandaag nog niet beschikbaar') + tmp = PersistentTemporaryFile(suffix='.epub') self.report_progress(0,_('downloading epub')) tmp.write(f.read()) - tmp.close() - - zfile = zipfile.ZipFile(tmp.name, 'r') - self.report_progress(0,_('extracting epub')) - - zfile.extractall(self.output_dir) + f.close() + br.close() + if zipfile.is_zipfile(tmp): + try: + zfile = zipfile.ZipFile(tmp.name, 'r') + zfile.extractall(self.output_dir) + self.report_progress(0,_('extracting epub')) + except zipfile.BadZipfile: + self.report_progress(0,_('BadZip error, continuing')) tmp.close() - index = os.path.join(self.output_dir, 'content.opf') + index = os.path.join(self.output_dir, 'metadata.opf') self.report_progress(1,_('epub downloaded and extracted')) diff --git a/resources/recipes/oakland_north.recipe b/resources/recipes/oakland_north.recipe new file mode 100644 index 0000000000..0ad165be40 --- /dev/null +++ b/resources/recipes/oakland_north.recipe @@ -0,0 +1,23 @@ +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class AdvancedUserRecipe1299640653(BasicNewsRecipe): + title = u'Oakland North' + oldest_article = 30 + max_articles_per_feed = 100 + + language = 'en' + __author__ = 'noah' + description = 'Oakland North' + category = 'news' + no_stylesheets = True + + masthead_url = 'http://oaklandnorth.net/wp-content/themes/oaklandnorth/images/masthead.png' + + keep_only_tags = [dict(name='div', attrs={'class':re.compile(r'\bpost\b(?!-)', re.IGNORECASE)})] + + remove_tags_after = [dict(name='p', attrs={'class':'post-postscript'})] + + remove_tags = [dict(name='p', attrs={'class':'post-postscript'})] + + feeds = [(u'All Headlines', u'http://oaklandnorth.net/feed/')] diff --git a/resources/recipes/onemagazine.recipe b/resources/recipes/onemagazine.recipe new file mode 100644 index 0000000000..73dd50141a --- /dev/null +++ b/resources/recipes/onemagazine.recipe @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +onemagazine.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Onemagazine(BasicNewsRecipe): + title = u'The ONE' + __author__ = u'Silviu Cotoar\u0103' + description = u'Be the ONE, not anyone ..' + publisher = u'The ONE' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Femei' + encoding = 'utf-8' + cover_url = 'http://www.onemagazine.ro/images/logo_rss.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'article'}) + , dict(name='div', attrs={'class':'gallery clearfix'}) + , dict(name='div', attrs={'align':'justify'}) + ] + + remove_tags = [ + dict(name='p', attrs={'class':['info']}) + , dict(name='table', attrs={'class':['connect_widget_interactive_area']}) + , dict(name='span', attrs={'class':['photo']}) + , dict(name='div', attrs={'class':['counter']}) + , dict(name='div', attrs={'class':['carousel']}) + , dict(name='div', attrs={'class':['jcarousel-container jcarousel-container-horizontal']}) + ] + + remove_tags_after = [ + dict(name='table', attrs={'class':['connect_widget_interactive_area']}) + ] + + feeds = [ + (u'Feeds', u'http://www.onemagazine.ro/rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/pcworldro.recipe b/resources/recipes/pcworldro.recipe new file mode 100644 index 0000000000..89ddbaf21d --- /dev/null +++ b/resources/recipes/pcworldro.recipe @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +pcworld.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Pcworld(BasicNewsRecipe): + title = u'PC World' + __author__ = u'Silviu Cotoar\u0103' + description = u'IT' + publisher = u'PC World' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri,IT' + encoding = 'utf-8' + cover_url = 'http://www.pcworld.ro/img/ui/header-logo.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'id':'content_page'}) + , dict(name='div', attrs={'class':'box_center content_body'}) + ] + + remove_tags = [ + dict(name='h3', attrs={'class':['breadcrumb']}) + , dict(name='div', attrs={'class':['box_center voteaza']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['box_center voteaza']}) + ] + + feeds = [ + (u'Feeds', u'http://www.pcworld.ro/contents/pcworld.rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/promotor.recipe b/resources/recipes/promotor.recipe new file mode 100644 index 0000000000..11a8499d7b --- /dev/null +++ b/resources/recipes/promotor.recipe @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +promotor.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Promotor(BasicNewsRecipe): + title = u'Promotor' + __author__ = u'Silviu Cotoar\u0103' + description = u'Auto-moto' + publisher = u'Promotor' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,TV,Auto' + encoding = 'utf-8' + cover_url = 'http://www.promotor.ro/images/logo_promotor.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'casetatitluarticol'}) + , dict(name='div', attrs={'style':'width: 273px; height: 210px; overflow: hidden; margin: 0pt auto;'}) + , dict(name='div', attrs={'class':'textb'}) + , dict(name='div', attrs={'class':'contentarticol'}) + ] + + remove_tags = [ + dict(name='td', attrs={'class':['connect_widget_vertical_center connect_widget_button_cell']}) + , dict(name='div', attrs={'class':['etichetagry']}) + , dict(name='span', attrs={'class':['textb']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['etichetagry']}) + , dict(name='span', attrs={'class':['textb']}) + ] + + feeds = [ + (u'Feeds', u'http://www.promotor.ro/rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/protvmagazin.recipe b/resources/recipes/protvmagazin.recipe new file mode 100644 index 0000000000..fbdb7465fc --- /dev/null +++ b/resources/recipes/protvmagazin.recipe @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +protvmagazin.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Protvmagazin(BasicNewsRecipe): + title = u'ProTv Magazin' + __author__ = u'Silviu Cotoar\u0103' + description = u'Ghid TV' + publisher = u'ProTv Magazin' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,TV' + encoding = 'utf-8' + cover_url = 'http://www.protvmagazin.ro/images/logo.png' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'box gradient'}) + ] + + remove_tags = [ + dict(name='p', attrs={'class':['title']}) + , dict(name='div', attrs={'id':['online_only']}) + , dict(name='div', attrs={'class':['show_article_rating']}) + , dict(name='ul', attrs={'class':['breadcrumbs']}) + , dict(name='p', attrs={'class':['tags']}) + ] + + remove_tags_after = [ + dict(name='table', attrs={'class':['connect_widget_interactive_area']}) + , dict(name='p', attrs={'class':['tags']}) + , dict(name='dev', attrs={'class':['connect_widget_sample_connections clearfix']}) + ] + + feeds = [ + (u'Feeds', u'http://www.protvmagazin.ro/rss/articole-noi') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/psychologies.recipe b/resources/recipes/psychologies.recipe new file mode 100644 index 0000000000..1b69a2ed9e --- /dev/null +++ b/resources/recipes/psychologies.recipe @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +psychologies.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Psychologies(BasicNewsRecipe): + title = u'Psychologies' + __author__ = u'Silviu Cotoar\u0103' + description = u'Psihologie \u015fi Dezvoltare Personal\u0103..' + publisher = u'Psychologies' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Psihologie' + encoding = 'utf-8' + cover_url = 'http://www.psychologies.ro/images/default/logo.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'nav'}) + , dict(name='div', attrs={'id':'textarticol'}) + + ] + + feeds = [ + (u'Feeds', u'http://feeds.feedburner.com/Psychologies') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/publika.recipe b/resources/recipes/publika.recipe new file mode 100644 index 0000000000..8380d02b17 --- /dev/null +++ b/resources/recipes/publika.recipe @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +publika.md +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Publika(BasicNewsRecipe): + title = u'Publika' + __author__ = u'Silviu Cotoar\u0103' + description = u'\u015etiri din Moldova' + publisher = u'Publika' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Stiri,Moldova' + encoding = 'utf-8' + cover_url = 'http://assets.publika.md/images/logo.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'id':'colLeft'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['articleInfo']}) + , dict(name='div', attrs={'class':['articleRelated']}) + , dict(name='div', attrs={'class':['roundedBox socialSharing']}) + , dict(name='div', attrs={'class':['comment clearfix']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['roundedBox socialSharing']}) + , dict(name='div', attrs={'class':['comment clearfix']}) + ] + + feeds = [ + (u'Feeds', u'http://rss.publika.md/stiri.xml') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/sltrib.py b/resources/recipes/sltrib.py new file mode 100644 index 0000000000..a6701ae296 --- /dev/null +++ b/resources/recipes/sltrib.py @@ -0,0 +1,56 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1278347258(BasicNewsRecipe): + title = u'Salt Lake City Tribune' + __author__ = 'Charles Holbert' + oldest_article = 7 + max_articles_per_feed = 100 + + description = '''Utah's independent news source since 1871''' + publisher = 'http://www.sltrib.com/' + category = 'news, Utah, SLC' + language = 'en' + encoding = 'utf-8' + #delay = 1 + #simultaneous_downloads = 1 + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + + #masthead_url = 'http://www.sltrib.com/csp/cms/sites/sltrib/assets/images/logo_main.png' + #cover_url = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg9/lg/UT_SLT.jpg' + + keep_only_tags = [dict(name='div',attrs={'id':'imageBox'}) + ,dict(name='div',attrs={'class':'headline'}) + ,dict(name='div',attrs={'class':'byline'}) + ,dict(name='p',attrs={'class':'TEXT_w_Indent'})] + + feeds = [(u'SL Tribune Today', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=All'), + (u'Utah News', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=UtahNews'), + (u'Business News', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Money'), + (u'Technology', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Technology'), + (u'Most Popular', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rsspopular.csp'), + (u'Sports', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Sports')] + + extra_css = ''' + .headline{font-family:Arial,Helvetica,sans-serif; font-size:xx-large; font-weight: bold; color:#0E5398;} + .byline{font-family:Arial,Helvetica,sans-serif; color:#333333; font-size:xx-small;} + .storytext{font-family:Arial,Helvetica,sans-serif; font-size:medium;} + ''' + + def print_version(self, url): + seg = url.split('/') + x = seg[5].split('-') + baseURL = 'http://www.sltrib.com/csp/cms/sites/sltrib/pages/printerfriendly.csp?id=' + s = baseURL + x[0] + return s + + def get_cover_url(self): + cover_url = None + href = 'http://www.newseum.org/todaysfrontpages/hr.asp?fpVname=UT_SLT&ref_pge=lst' + soup = self.index_to_soup(href) + div = soup.find('div',attrs={'class':'tfpLrgView_container'}) + if div: + cover_url = div.img['src'] + return cover_url + diff --git a/resources/recipes/thai_post_daily.recipe b/resources/recipes/thai_post_daily.recipe index 2be17cc37f..4523a9331a 100644 --- a/resources/recipes/thai_post_daily.recipe +++ b/resources/recipes/thai_post_daily.recipe @@ -3,6 +3,7 @@ from calibre.web.feeds.news import BasicNewsRecipe class AdvancedUserRecipe1299054026(BasicNewsRecipe): title = u'Thai Post Daily' __author__ = 'Chotechai P.' + language = 'th' oldest_article = 7 max_articles_per_feed = 100 cover_url = 'http://upload.wikimedia.org/wikipedia/th/1/10/ThaiPost_Logo.png' diff --git a/resources/recipes/timesnewroman.recipe b/resources/recipes/timesnewroman.recipe new file mode 100644 index 0000000000..12672aa888 --- /dev/null +++ b/resources/recipes/timesnewroman.recipe @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +timesnewroman.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class TimesNewRoman(BasicNewsRecipe): + title = u'Times New Roman' + __author__ = u'Silviu Cotoar\u0103' + description = u'Cotidian independent de umor voluntar' + publisher = u'Times New Roman' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Fun' + encoding = 'utf-8' + cover_url = 'http://www.timesnewroman.ro/templates/TNRV2/images/logo.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'id':'page'}) + ] + + remove_tags = [ + dict(name='p', attrs={'class':['articleinfo']}) + , dict(name='div',attrs={'class':['vergefacebooklike']}) + , dict(name='div', attrs={'class':'cleared'}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':'cleared'}) + ] + + feeds = [ + (u'Feeds', u'http://www.timesnewroman.ro/index.php?format=feed&type=rss') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/trombon.recipe b/resources/recipes/trombon.recipe new file mode 100644 index 0000000000..1a4e488a43 --- /dev/null +++ b/resources/recipes/trombon.recipe @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +trombon.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Trombon(BasicNewsRecipe): + title = u'Trombon' + __author__ = u'Silviu Cotoar\u0103' + description = u'Parodii si Pamflete' + publisher = u'Trombon' + oldest_article = 5 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Fun' + encoding = 'utf-8' + cover_url = 'http://www.trombon.ro/i/trombon.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'class':'articol'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['info_2']}) + , dict(name='iframe', attrs={'scrolling':['no']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'id':'article_vote'}) + ] + + feeds = [ + (u'Feeds', u'http://feeds.feedburner.com/trombon/ABWb?format=xml') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/tvmania.recipe b/resources/recipes/tvmania.recipe new file mode 100644 index 0000000000..a2d9fcc060 --- /dev/null +++ b/resources/recipes/tvmania.recipe @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +tvmania.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Tvmania(BasicNewsRecipe): + title = u'TVmania' + __author__ = u'Silviu Cotoar\u0103' + description = u'Programe TV' + publisher = u'TVmania' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,TV' + encoding = 'utf-8' + cover_url = 'http://www.tvmania.ro/wp-content/themes/tvmania/images/logo.png' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'articol'}) + , dict(name='font', attrs={'class':'mic'}) + , dict(name='div', attrs={'id':'header_recomandari'}) + , dict(name='div', attrs={'class':'main-image'}) + , dict(name='div', attrs={'id':'articol_recomandare'}) + + ] + + remove_tags = [ + dict(name='div', attrs={'class':['iLikeThis']}) + , dict(name='span', attrs={'class':['tag-links']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['iLikeThis']}) + , dict(name='span', attrs={'class':['tag-links']}) + ] + + feeds = [ + (u'Feeds', u'http://www.tvmania.ro/feed') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/viva.recipe b/resources/recipes/viva.recipe new file mode 100644 index 0000000000..df697ea298 --- /dev/null +++ b/resources/recipes/viva.recipe @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +viva.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Viva(BasicNewsRecipe): + title = u'Viva' + __author__ = u'Silviu Cotoar\u0103' + description = u'Vedete si evenimente' + publisher = u'Viva' + oldest_article = 25 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare,Reviste,Femei' + encoding = 'utf-8' + cover_url = 'http://www.viva.ro/images/default/viva.gif' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} + .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} + .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'class':'articol'}) + , dict(name='div', attrs={'class':'gallery clearfix'}) + , dict(name='div', attrs={'align':'justify'}) + ] + + remove_tags = [ + dict(name='div', attrs={'class':['breadcrumbs']}) + , dict(name='div', attrs={'class':['links clearfix']}) + , dict(name='a', attrs={'id':['img_arrow_right']}) + , dict(name='img', attrs={'id':['zoom']}) + , dict(name='div', attrs={'class':['foto_counter']}) + , dict(name='div', attrs={'class':['gal_select clearfix']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':['links clearfix']}) + ] + + feeds = [ + (u'Vedete', u'http://feeds.feedburner.com/viva-Vedete') + ,(u'Evenimente', u'http://feeds.feedburner.com/viva-Evenimente') + ,(u'Frumusete', u'http://feeds.feedburner.com/viva-Beauty-Fashion') + ,(u'Noutati', u'http://feeds.feedburner.com/viva-Noutati') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/recipes/wallstreetro.recipe b/resources/recipes/wallstreetro.recipe new file mode 100644 index 0000000000..8a66aa3673 --- /dev/null +++ b/resources/recipes/wallstreetro.recipe @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2011, Silviu Cotoar\u0103' +''' +wall-street.ro +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class WallStreetRo(BasicNewsRecipe): + title = u'Wall Street' + __author__ = u'Silviu Cotoar\u0103' + description = '' + publisher = 'Wall Street' + oldest_article = 5 + language = 'ro' + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + category = 'Ziare' + encoding = 'utf-8' + cover_url = 'http://img.wall-street.ro/images/WS_new_logo.jpg' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [ + dict(name='div', attrs={'class':'article_header'}) + , dict(name='div', attrs={'class':'article_text'}) + ] + + remove_tags = [ + dict(name='p', attrs={'class':['page_breadcrumbs']}) + , dict(name='div', attrs={'id':['article_user_toolbox']}) + , dict(name='p', attrs={'class':['comments_count_container']}) + , dict(name='div', attrs={'class':['article_left_column']}) + ] + + remove_tags_after = [ + dict(name='div', attrs={'class':'clearfloat'}) + ] + + feeds = [ + (u'Feeds', u'http://img.wall-street.ro/rssfeeds/wall-street.xml') + ] + + def preprocess_html(self, soup): + return self.adeify_images(soup) diff --git a/resources/template-functions.json b/resources/template-functions.json index fe4379d701..c19627c6c7 100644 --- a/resources/template-functions.json +++ b/resources/template-functions.json @@ -16,6 +16,7 @@ "template": "def evaluate(self, formatter, kwargs, mi, locals, template):\n template = template.replace('[[', '{').replace(']]', '}')\n return formatter.__class__().safe_format(template, kwargs, 'TEMPLATE', mi)\n", "print": "def evaluate(self, formatter, kwargs, mi, locals, *args):\n print args\n return None\n", "titlecase": "def evaluate(self, formatter, kwargs, mi, locals, val):\n return titlecase(val)\n", + "subitems": "def evaluate(self, formatter, kwargs, mi, locals, val, start_index, end_index):\n if not val:\n return ''\n si = int(start_index)\n ei = int(end_index)\n items = [v.strip() for v in val.split(',')]\n rv = set()\n for item in items:\n component = item.split('.')\n try:\n if ei == 0:\n rv.add('.'.join(component[si:]))\n else:\n rv.add('.'.join(component[si:ei]))\n except:\n pass\n return ', '.join(sorted(rv, key=sort_key))\n", "sublist": "def evaluate(self, formatter, kwargs, mi, locals, val, start_index, end_index, sep):\n if not val:\n return ''\n si = int(start_index)\n ei = int(end_index)\n val = val.split(sep)\n try:\n if ei == 0:\n return sep.join(val[si:])\n else:\n return sep.join(val[si:ei])\n except:\n return ''\n", "test": "def evaluate(self, formatter, kwargs, mi, locals, val, value_if_set, value_not_set):\n if val:\n return value_if_set\n else:\n return value_not_set\n", "eval": "def evaluate(self, formatter, kwargs, mi, locals, template):\n from formatter import eval_formatter\n template = template.replace('[[', '{').replace(']]', '}')\n return eval_formatter.safe_format(template, locals, 'EVAL', None)\n", diff --git a/resources/templates/fb2.xsl b/resources/templates/fb2.xsl index 77c03cdc74..273edd71ae 100644 --- a/resources/templates/fb2.xsl +++ b/resources/templates/fb2.xsl @@ -4,6 +4,7 @@ # # # # # copyright 2002 Paul Henry Tremblay # +# Copyright 2011 Kovid Goyal # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # @@ -19,21 +20,21 @@ ######################################################################### --> - - - - - - - - - - <xsl:value-of select="fb:description/fb:title-info/fb:book-title"/> - - + - - - -
- -
-
-
- -
    - -
-
+ + + +
+ +
+
+
+ +
    + +
+
- - - -
-
- -

- -

-
- - -
- - -
- - - - - + + + +
+
+ +

+ +

+
+ + +
+ + +
+ + + + + - -
-
- - -
  • - - - , # - - - -
      - - - -
    -
    - - - - - - - - - -
  • - - -
    -
    -
  • - - - - - - - - - -
    -
    + +
    + + + +
  • + + + , # + + + +
      + + + +
    +
    + + + + + + + + + +
  • + + +
    +
    +
  • + + +
    + + + + + + +
    +
    - + @@ -164,15 +165,15 @@ - - - - - + + + + + - - - + + + @@ -181,79 +182,79 @@ TOC_ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - -
    -
    - - - - - - - -
    - -
    -
    - - + +
    +
    + + + + + + + +
    + +
    +
    + + paragraph - - - - + + + + - - - - - - - - - - - - - - - -
    -
    +
    + + + + + + + + + + + + + + +
    +
    @@ -261,123 +262,140 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Annotation

    - -
    - - -
    - - - - - - -
    -
    - - -
    - -
    -
    - - -
    - - - - - - -
    -
    - - -
    -
    -
    - - - - -     -
    -
    - -     -
    -
    -
    -
    - - -
    - - - - - - -
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Annotation

    + +
    + + + + +
    +
    + + + + + + + + + + + + + +
    + + + + + + +
    +
    + + +
    + +
    +
    + + +
    + + + + + + +
    +
    + + +
    +
    +
    + + + + +     +
    +
    + +     +
    +
    +
    +
    + + +
    + + + + + + +
    +
    - - - -
    -
    - - - - - - - -
    -
    - - -
    - - - - - - - - - - -
    -
    + + + +
    +
    + + + + + + + +
    +
    + + +
    + + + + + + + + + + +
    +
    diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 605307d44b..f25a6341ca 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -63,8 +63,9 @@ def osx_version(): if m: return int(m.group(1)), int(m.group(2)), int(m.group(3)) - _filename_sanitize = re.compile(r'[\xae\0\\|\?\*<":>\+/]') +_filename_sanitize_unicode = frozenset([u'\\', u'|', u'?', u'*', u'<', + u'"', u':', u'>', u'+', u'/'] + list(map(unichr, xrange(32)))) def sanitize_file_name(name, substitute='_', as_unicode=False): ''' @@ -85,8 +86,35 @@ def sanitize_file_name(name, substitute='_', as_unicode=False): one = one.decode(filesystem_encoding) one = one.replace('..', substitute) # Windows doesn't like path components that end with a period - if one.endswith('.'): + if one and one[-1] in ('.', ' '): one = one[:-1]+'_' + # Names starting with a period are hidden on Unix + if one.startswith('.'): + one = '_' + one[1:] + return one + +def sanitize_file_name_unicode(name, substitute='_'): + ''' + Sanitize the filename `name`. All invalid characters are replaced by `substitute`. + The set of invalid characters is the union of the invalid characters in Windows, + OS X and Linux. Also removes leading and trailing whitespace. + **WARNING:** This function also replaces path separators, so only pass file names + and not full paths to it. + ''' + if not isinstance(name, unicode): + return sanitize_file_name(name, substitute=substitute, as_unicode=True) + chars = [substitute if c in _filename_sanitize_unicode else c for c in + name] + one = u''.join(chars) + one = re.sub(r'\s', ' ', one).strip() + one = re.sub(r'^\.+$', '_', one) + one = one.replace('..', substitute) + # Windows doesn't like path components that end with a period or space + if one and one[-1] in ('.', ' '): + one = one[:-1]+'_' + # Names starting with a period are hidden on Unix + if one.startswith('.'): + one = '_' + one[1:] return one diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 2c4ae9d512..0013486506 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.7.48' +__version__ = '0.7.49' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index e6c1b4bdbe..1a3e8b7511 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -92,7 +92,7 @@ class TXT2TXTZ(FileTypePlugin): 'containing Markdown or Textile references to images. The referenced ' 'images as well as the TXT file are added to the archive.') version = numeric_version - file_types = set(['txt']) + file_types = set(['txt', 'text']) supported_platforms = ['windows', 'osx', 'linux'] on_import = True diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 3724f02ca2..81d35cc159 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -35,7 +35,7 @@ class ANDROID(USBMS): # Motorola 0x22b8 : { 0x41d9 : [0x216], 0x2d61 : [0x100], 0x2d67 : [0x100], 0x41db : [0x216], 0x4285 : [0x216], 0x42a3 : [0x216], - 0x4286 : [0x216], 0x42b3 : [0x216] }, + 0x4286 : [0x216], 0x42b3 : [0x216], 0x42b4 : [0x216] }, # Sony Ericsson 0xfce : { 0xd12e : [0x0100]}, @@ -57,7 +57,7 @@ class ANDROID(USBMS): 0x413c : { 0xb007 : [0x0100, 0x0224]}, # LG - 0x1004 : { 0x61cc : [0x100] }, + 0x1004 : { 0x61cc : [0x100], 0x61ce : [0x100] }, # Archos 0x0e79 : { @@ -78,6 +78,9 @@ class ANDROID(USBMS): # Xperia 0x13d3 : { 0x3304 : [0x0001, 0x0002] }, + # CREEL?? Also Nextbook + 0x5e3 : { 0x726 : [0x222] }, + } EBOOK_DIR_MAIN = ['eBooks/import', 'wordplayer/calibretransfer', 'Books'] EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to ' @@ -93,7 +96,8 @@ class ANDROID(USBMS): 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000', 'DESIRE', 'SGH-T849', '_MB300', 'A70S', 'S_ANDROID', 'A101IT', 'A70H', - 'IDEOS_TABLET', 'MYTOUCH_4G', 'UMS_COMPOSITE', 'SCH-I800_CARD', '7'] + 'IDEOS_TABLET', 'MYTOUCH_4G', 'UMS_COMPOSITE', 'SCH-I800_CARD', + '7', 'A956'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD', 'A70S', 'A101IT', '7'] diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index 07b381d11a..01eba48a30 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -224,7 +224,7 @@ class TREKSTOR(USBMS): FORMATS = ['epub', 'txt', 'pdf'] VENDOR_ID = [0x1e68] - PRODUCT_ID = [0x0041] + PRODUCT_ID = [0x0041, 0x0042] BCD = [0x0002] EBOOK_DIR_MAIN = 'Ebooks' diff --git a/src/calibre/devices/prs500/cli/main.py b/src/calibre/devices/prs500/cli/main.py index cd8395467b..6d568b01a2 100755 --- a/src/calibre/devices/prs500/cli/main.py +++ b/src/calibre/devices/prs500/cli/main.py @@ -213,7 +213,7 @@ def main(): for d in connected_devices: try: - d.open() + d.open(None) except: continue else: diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 0ae640113a..c5bac936b5 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -25,7 +25,7 @@ class DRMError(ValueError): class ParserError(ValueError): pass -BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'htm', 'xhtm', +BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'htm', 'xhtm', 'html', 'xhtml', 'pdf', 'pdb', 'pdr', 'prc', 'mobi', 'azw', 'doc', 'epub', 'fb2', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip', 'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml', 'pmlz', 'mbp', 'tan', 'snb'] diff --git a/src/calibre/ebooks/chm/input.py b/src/calibre/ebooks/chm/input.py index 89efa2b4d1..f55a76d67e 100644 --- a/src/calibre/ebooks/chm/input.py +++ b/src/calibre/ebooks/chm/input.py @@ -22,7 +22,7 @@ class CHMInput(InputFormatPlugin): def _chmtohtml(self, output_dir, chm_path, no_images, log): from calibre.ebooks.chm.reader import CHMReader log.debug('Opening CHM file') - rdr = CHMReader(chm_path, log) + rdr = CHMReader(chm_path, log, self.opts) log.debug('Extracting CHM to %s' % output_dir) rdr.extract_content(output_dir) self._chm_reader = rdr @@ -32,13 +32,13 @@ class CHMInput(InputFormatPlugin): def convert(self, stream, options, file_ext, log, accelerators): from calibre.ebooks.chm.metadata import get_metadata_from_reader from calibre.customize.ui import plugin_for_input_format + self.opts = options log.debug('Processing CHM...') with TemporaryDirectory('_chm2oeb') as tdir: html_input = plugin_for_input_format('html') for opt in html_input.options: setattr(options, opt.option.name, opt.recommended_value) - options.input_encoding = 'utf-8' no_images = False #options.no_images chm_name = stream.name #chm_data = stream.read() @@ -54,6 +54,7 @@ class CHMInput(InputFormatPlugin): odi = options.debug_pipeline options.debug_pipeline = None + options.input_encoding = 'utf-8' # try a custom conversion: #oeb = self._create_oebbook(mainpath, tdir, options, log, metadata) # try using html converter: diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index fe8b4fdbde..34d228ef3b 100644 --- a/src/calibre/ebooks/chm/reader.py +++ b/src/calibre/ebooks/chm/reader.py @@ -40,13 +40,14 @@ class CHMError(Exception): pass class CHMReader(CHMFile): - def __init__(self, input, log): + def __init__(self, input, log, opts): CHMFile.__init__(self) if isinstance(input, unicode): input = input.encode(filesystem_encoding) if not self.LoadCHM(input): raise CHMError("Unable to open CHM file '%s'"%(input,)) self.log = log + self.opts = opts self._sourcechm = input self._contents = None self._playorder = 0 @@ -151,6 +152,8 @@ class CHMReader(CHMFile): break def _reformat(self, data, htmlpath): + if self.opts.input_encoding: + data = data.decode(self.opts.input_encoding) try: data = xml_to_unicode(data, strip_encoding_pats=True)[0] soup = BeautifulSoup(data) diff --git a/src/calibre/ebooks/comic/input.py b/src/calibre/ebooks/comic/input.py index 7710d41fb3..56fa123249 100755 --- a/src/calibre/ebooks/comic/input.py +++ b/src/calibre/ebooks/comic/input.py @@ -131,9 +131,12 @@ class PageProcessor(list): # {{{ newsizey = int(newsizex / aspect) deltax = 0 deltay = (SCRHEIGHT - newsizey) / 2 - wand.size = (newsizex, newsizey) - wand.set_border_color(pw) - wand.add_border(pw, deltax, deltay) + if newsizex < 20000 and newsizey < 20000: + # Too large and resizing fails, so better + # to leave it as original size + wand.size = (newsizex, newsizey) + wand.set_border_color(pw) + wand.add_border(pw, deltax, deltay) elif self.opts.wide: # Keep aspect and Use device height as scaled image width so landscape mode is clean aspect = float(sizex) / float(sizey) @@ -152,11 +155,15 @@ class PageProcessor(list): # {{{ newsizey = int(newsizex / aspect) deltax = 0 deltay = (wscreeny - newsizey) / 2 - wand.size = (newsizex, newsizey) - wand.set_border_color(pw) - wand.add_border(pw, deltax, deltay) + if newsizex < 20000 and newsizey < 20000: + # Too large and resizing fails, so better + # to leave it as original size + wand.size = (newsizex, newsizey) + wand.set_border_color(pw) + wand.add_border(pw, deltax, deltay) else: - wand.size = (SCRWIDTH, SCRHEIGHT) + if SCRWIDTH < 20000 and SCRHEIGHT < 20000: + wand.size = (SCRWIDTH, SCRHEIGHT) if not self.opts.dont_sharpen: wand.sharpen(0.0, 1.0) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 43f93807a1..d86a83e9b0 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -72,7 +72,7 @@ class FB2MLizer(object): def clean_text(self, text): # Condense empty paragraphs into a line break. - text = re.sub(r'(?miu)(

    \s*

    \s*){3,}', '

    ', text) + text = re.sub(r'(?miu)(

    \s*

    \s*){3,}', '', text) # Remove empty paragraphs. text = re.sub(r'(?miu)

    \s*

    ', '', text) # Clean up pargraph endings. @@ -101,9 +101,6 @@ class FB2MLizer(object): def fb2_header(self): metadata = {} - metadata['author_first'] = u'' - metadata['author_middle'] = u'' - metadata['author_last'] = u'' metadata['title'] = self.oeb_book.metadata.title[0].value metadata['appname'] = __appname__ metadata['version'] = __version__ @@ -115,16 +112,36 @@ class FB2MLizer(object): metadata['id'] = None metadata['cover'] = self.get_cover() - author_parts = self.oeb_book.metadata.creator[0].value.split(' ') - if len(author_parts) == 1: - metadata['author_last'] = author_parts[0] - elif len(author_parts) == 2: - metadata['author_first'] = author_parts[0] - metadata['author_last'] = author_parts[1] - else: - metadata['author_first'] = author_parts[0] - metadata['author_middle'] = ' '.join(author_parts[1:-2]) - metadata['author_last'] = author_parts[-1] + metadata['author'] = u'' + for auth in self.oeb_book.metadata.creator: + author_first = u'' + author_middle = u'' + author_last = u'' + author_parts = auth.value.split(' ') + if len(author_parts) == 1: + author_last = author_parts[0] + elif len(author_parts) == 2: + author_first = author_parts[0] + author_last = author_parts[1] + else: + author_first = author_parts[0] + author_middle = ' '.join(author_parts[1:-1]) + author_last = author_parts[-1] + metadata['author'] += '' + metadata['author'] += '%s' % prepare_string_for_xml(author_first) + if author_middle: + metadata['author'] += '%s' % prepare_string_for_xml(author_middle) + metadata['author'] += '%s' % prepare_string_for_xml(author_last) + metadata['author'] += '' + if not metadata['author']: + metadata['author'] = u'' + + metadata['sequence'] = u'' + if self.oeb_book.metadata.series: + index = '1' + if self.oeb_book.metadata.series_index: + index = self.oeb_book.metadata.series_index[0] + metadata['sequence'] = u'' % (prepare_string_for_xml(u'%s' % self.oeb_book.metadata.series[0]), index) identifiers = self.oeb_book.metadata['identifier'] for x in identifiers: @@ -136,28 +153,21 @@ class FB2MLizer(object): metadata['id'] = str(uuid.uuid4()) for key, value in metadata.items(): - if not key == 'cover': + if key not in ('author', 'cover', 'sequence'): metadata[key] = prepare_string_for_xml(value) return u'' \ '' \ '' \ 'antique' \ - '' \ - '%(author_first)s' \ - '%(author_middle)s' \ - '%(author_last)s' \ - '' \ + '%(author)s' \ '%(title)s' \ '%(cover)s' \ '%(lang)s' \ + '%(sequence)s' \ '' \ '' \ - '' \ - '' \ - '' \ - '' \ - '' \ + '%(author)s' \ '%(appname)s %(version)s' \ '%(date)s' \ '%(id)s' \ diff --git a/src/calibre/ebooks/metadata/amazon.py b/src/calibre/ebooks/metadata/amazon.py index c87249ed39..91e6919837 100644 --- a/src/calibre/ebooks/metadata/amazon.py +++ b/src/calibre/ebooks/metadata/amazon.py @@ -23,8 +23,9 @@ cover_url_cache = {} cache_lock = RLock() def find_asin(br, isbn): - q = 'http://www.amazon.com/s?field-keywords='+isbn - raw = br.open_novisit(q).read() + q = 'http://www.amazon.com/s/?search-alias=aps&field-keywords='+isbn + res = br.open_novisit(q) + raw = res.read() raw = xml_to_unicode(raw, strip_encoding_pats=True, resolve_entities=True)[0] root = html.fromstring(raw) @@ -151,6 +152,8 @@ def get_metadata(br, asin, mi): root = soupparser.fromstring(raw) except: return False + if root.xpath('//*[@id="errorMessage"]'): + return False ratings = root.xpath('//form[@id="handleBuy"]/descendant::*[@class="asinReviewsSummary"]') if ratings: pat = re.compile(r'([0-9.]+) out of (\d+) stars') @@ -191,6 +194,7 @@ def main(args=sys.argv): tdir = tempfile.gettempdir() br = browser() for title, isbn in [ + ('The Heroes', '9780316044981'), # Test find_asin ('Learning Python', '8324616489'), # Test xisbn ('Angels & Demons', '9781416580829'), # Test sophisticated comment formatting # Random tests @@ -207,8 +211,12 @@ def main(args=sys.argv): #import time #st = time.time() - print get_social_metadata(title, None, None, isbn) + mi = get_social_metadata(title, None, None, isbn) + if not mi.comments: + print 'Failed to downlaod social metadata for', title + return 1 #print '\n\n', time.time() - st, '\n\n' + print '\n' return 0 diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index a2599ab0b5..feb6ff4bb9 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -130,7 +130,7 @@ class Metadata(object): self.set_identifiers(val) elif field in STANDARD_METADATA_FIELDS: if val is None: - val = NULL_VALUES.get(field, None) + val = copy.copy(NULL_VALUES.get(field, None)) _data[field] = val elif field in _data['user_metadata'].iterkeys(): _data['user_metadata'][field]['#value#'] = val diff --git a/src/calibre/ebooks/metadata/covers.py b/src/calibre/ebooks/metadata/covers.py index 15e0a05c1e..74b210a9a1 100644 --- a/src/calibre/ebooks/metadata/covers.py +++ b/src/calibre/ebooks/metadata/covers.py @@ -74,6 +74,8 @@ class HeadRequest(mechanize.Request): class OpenLibraryCovers(CoverDownload): # {{{ 'Download covers from openlibrary.org' + # See http://openlibrary.org/dev/docs/api/covers + OPENLIBRARY = 'http://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false' name = 'openlibrary.org covers' description = _('Download covers from openlibrary.org') @@ -82,7 +84,8 @@ class OpenLibraryCovers(CoverDownload): # {{{ def has_cover(self, mi, ans, timeout=5.): if not mi.isbn: return False - br = browser() + from calibre.ebooks.metadata.library_thing import get_browser + br = get_browser() br.set_handle_redirect(False) try: br.open_novisit(HeadRequest(self.OPENLIBRARY%mi.isbn), timeout=timeout) @@ -98,7 +101,8 @@ class OpenLibraryCovers(CoverDownload): # {{{ def get_covers(self, mi, result_queue, abort, timeout=5.): if not mi.isbn: return - br = browser() + from calibre.ebooks.metadata.library_thing import get_browser + br = get_browser() try: ans = br.open(self.OPENLIBRARY%mi.isbn, timeout=timeout).read() result_queue.put((True, ans, 'jpg', self.name)) @@ -137,6 +141,8 @@ class AmazonCovers(CoverDownload): # {{{ br = browser() try: url = get_cover_url(mi.isbn, br) + if url is None: + raise ValueError('No cover found for ISBN: %s'%mi.isbn) cover_data = br.open_novisit(url).read() result_queue.put((True, cover_data, 'jpg', self.name)) except Exception, e: diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 7e99916fc3..7f3f40184c 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -908,6 +908,19 @@ class Manifest(object): pass data = first_pass(data) + if data.tag == 'HTML': + # Lower case all tag and attribute names + data.tag = data.tag.lower() + for x in data.iterdescendants(): + try: + x.tag = x.tag.lower() + for key, val in list(x.attrib.iteritems()): + del x.attrib[key] + key = key.lower() + x.attrib[key] = val + except: + pass + # Handle weird (non-HTML/fragment) files if barename(data.tag) != 'html': self.oeb.log.warn('File %r does not appear to be (X)HTML'%self.href) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index efc8fe1463..0cd17387fe 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -8,11 +8,7 @@ from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -import os -import itertools -import re -import logging -import copy +import os, itertools, re, logging, copy, unicodedata from weakref import WeakKeyDictionary from xml.dom import SyntaxErr as CSSSyntaxError import cssutils @@ -234,8 +230,18 @@ class Stylizer(object): for elem in matches: for x in elem.iter(): if x.text: - span = E.span(x.text[0]) - span.tail = x.text[1:] + punctuation_chars = [] + text = unicode(x.text) + while text: + if not unicodedata.category(text[0]).startswith('P'): + break + punctuation_chars.append(text[0]) + text = text[1:] + + special_text = u''.join(punctuation_chars) + \ + (text[0] if text else u'') + span = E.span(special_text) + span.tail = text[1:] x.text = None x.insert(0, span) self.style(span)._update_cssdict(cssdict) diff --git a/src/calibre/ebooks/oeb/transforms/structure.py b/src/calibre/ebooks/oeb/transforms/structure.py index 0db9b153df..fc338da692 100644 --- a/src/calibre/ebooks/oeb/transforms/structure.py +++ b/src/calibre/ebooks/oeb/transforms/structure.py @@ -13,6 +13,7 @@ from urlparse import urlparse from calibre.ebooks.oeb.base import XPNSMAP, TOC, XHTML, xml2text from calibre.ebooks import ConversionError +from calibre.utils.ordered_dict import OrderedDict def XPath(x): try: @@ -95,10 +96,8 @@ class DetectStructure(object): self.log.exception('Failed to mark chapter') def create_level_based_toc(self): - if self.opts.level1_toc is None: - return - for item in self.oeb.spine: - self.add_leveled_toc_items(item) + if self.opts.level1_toc is not None: + self.add_leveled_toc_items() def create_toc_from_chapters(self): counter = self.oeb.toc.next_play_order() @@ -145,49 +144,57 @@ class DetectStructure(object): return text, href - def add_leveled_toc_items(self, item): - level1 = XPath(self.opts.level1_toc)(item.data) - level1_order = [] - document = item - + def add_leveled_toc_items(self): + added = OrderedDict() + added2 = OrderedDict() counter = 1 - if level1: - added = {} - for elem in level1: + for document in self.oeb.spine: + previous_level1 = list(added.itervalues())[-1] if added else None + previous_level2 = list(added2.itervalues())[-1] if added2 else None + + for elem in XPath(self.opts.level1_toc)(document.data): text, _href = self.elem_to_link(document, elem, counter) counter += 1 if text: node = self.oeb.toc.add(text, _href, play_order=self.oeb.toc.next_play_order()) - level1_order.append(node) added[elem] = node #node.add(_('Top'), _href) - if self.opts.level2_toc is not None: - added2 = {} - level2 = list(XPath(self.opts.level2_toc)(document.data)) - for elem in level2: + + if self.opts.level2_toc is not None and added: + for elem in XPath(self.opts.level2_toc)(document.data): level1 = None for item in document.data.iterdescendants(): - if item in added.keys(): + if item in added: level1 = added[item] - elif item == elem and level1 is not None: + elif item == elem: + if level1 is None: + if previous_level1 is None: + break + level1 = previous_level1 text, _href = self.elem_to_link(document, elem, counter) counter += 1 if text: added2[elem] = level1.add(text, _href, play_order=self.oeb.toc.next_play_order()) - if self.opts.level3_toc is not None: - level3 = list(XPath(self.opts.level3_toc)(document.data)) - for elem in level3: + break + + if self.opts.level3_toc is not None and added2: + for elem in XPath(self.opts.level3_toc)(document.data): level2 = None for item in document.data.iterdescendants(): - if item in added2.keys(): + if item in added2: level2 = added2[item] - elif item == elem and level2 is not None: + elif item == elem: + if level2 is None: + if previous_level2 is None: + break + level2 = previous_level2 text, _href = \ self.elem_to_link(document, elem, counter) counter += 1 if text: level2.add(text, _href, - play_order=self.oeb.toc.next_play_order()) + play_order=self.oeb.toc.next_play_order()) + break diff --git a/src/calibre/ebooks/pdf/writer.py b/src/calibre/ebooks/pdf/writer.py index b0884417f6..516509fdd7 100644 --- a/src/calibre/ebooks/pdf/writer.py +++ b/src/calibre/ebooks/pdf/writer.py @@ -46,7 +46,8 @@ def get_pdf_printer(opts, for_comic=False): printer = QPrinter(QPrinter.HighResolution) custom_size = get_custom_size(opts) - if opts.output_profile.short_name == 'default': + if opts.output_profile.short_name == 'default' or \ + opts.output_profile.width > 10000: if custom_size is None: printer.setPaperSize(paper_size(opts.paper_size)) else: diff --git a/src/calibre/ebooks/rtf2xml/tokenize.py b/src/calibre/ebooks/rtf2xml/tokenize.py index 3dcaf0fcb1..25640586db 100755 --- a/src/calibre/ebooks/rtf2xml/tokenize.py +++ b/src/calibre/ebooks/rtf2xml/tokenize.py @@ -46,7 +46,8 @@ class Tokenize: def __remove_uc_chars(self, startchar, token): for i in xrange(startchar, len(token)): - if token[i] == " ": + #handle the case of an uc char with a terminating blank before ansi char + if token[i] == " " and self.__uc_char: continue elif self.__uc_char: self.__uc_char -= 1 diff --git a/src/calibre/ebooks/snb/snbfile.py b/src/calibre/ebooks/snb/snbfile.py index e42533f241..9a7d65e417 100644 --- a/src/calibre/ebooks/snb/snbfile.py +++ b/src/calibre/ebooks/snb/snbfile.py @@ -75,15 +75,20 @@ class SNBFile: for i in range(self.plainBlock): bzdc = bz2.BZ2Decompressor() if (i < self.plainBlock - 1): - bSize = self.blocks[self.binBlock + i + 1].Offset - self.blocks[self.binBlock + i].Offset; + bSize = self.blocks[self.binBlock + i + 1].Offset - self.blocks[self.binBlock + i].Offset else: - bSize = self.tailOffset - self.blocks[self.binBlock + i].Offset; - snbFile.seek(self.blocks[self.binBlock + i].Offset); + bSize = self.tailOffset - self.blocks[self.binBlock + i].Offset + snbFile.seek(self.blocks[self.binBlock + i].Offset) try: data = snbFile.read(bSize) - uncompressedData += bzdc.decompress(data) + if len(data) < 32768: + uncompressedData += bzdc.decompress(data) + else: + uncompressedData += data except Exception, e: print e + if len(uncompressedData) != self.plainStreamSizeUncompressed: + raise Exception() f.fileBody = uncompressedData[plainPos:plainPos+f.fileSize] plainPos += f.fileSize elif f.attr & 0x01000000 == 0x01000000: diff --git a/src/calibre/ebooks/txt/input.py b/src/calibre/ebooks/txt/input.py index 1c49eb9b35..99f7035800 100644 --- a/src/calibre/ebooks/txt/input.py +++ b/src/calibre/ebooks/txt/input.py @@ -22,7 +22,7 @@ class TXTInput(InputFormatPlugin): name = 'TXT Input' author = 'John Schember' description = 'Convert TXT files to HTML' - file_types = set(['txt', 'txtz']) + file_types = set(['txt', 'txtz', 'text']) options = set([ OptionRecommendation(name='paragraph_type', recommended_value='auto', @@ -65,7 +65,6 @@ class TXTInput(InputFormatPlugin): txt = '' log.debug('Reading text from file...') length = 0 - # [(u'path', mime),] # Extract content from zip archive. if file_ext == 'txtz': @@ -73,7 +72,7 @@ class TXTInput(InputFormatPlugin): zf.extractall('.') for x in walk('.'): - if os.path.splitext(x)[1].lower() == '.txt': + if os.path.splitext(x)[1].lower() in ('.txt', '.text'): with open(x, 'rb') as tf: txt += tf.read() + '\n\n' else: diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index efe09e8866..9649a79cc1 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -340,6 +340,7 @@ class FileIconProvider(QFileIconProvider): 'rar' : 'rar', 'zip' : 'zip', 'txt' : 'txt', + 'text' : 'txt', 'prc' : 'mobi', 'azw' : 'mobi', 'mobi' : 'mobi', diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 0040acea28..cf67cd6cfa 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -204,15 +204,29 @@ class AddAction(InterfaceAction): to_device = self.gui.stack.currentIndex() != 0 self._add_books(paths, to_device) - def files_dropped_on_book(self, event, paths): + def remote_file_dropped_on_book(self, url, fname): + if self.gui.current_view() is not self.gui.library_view: + return + db = self.gui.library_view.model().db + current_idx = self.gui.library_view.currentIndex() + if not current_idx.isValid(): return + cid = db.id(current_idx.row()) + from calibre.gui2.dnd import DownloadDialog + d = DownloadDialog(url, fname, self.gui) + d.start_download() + if d.err is None: + self.files_dropped_on_book(None, [d.fpath], cid=cid) + + def files_dropped_on_book(self, event, paths, cid=None): accept = False if self.gui.current_view() is not self.gui.library_view: return db = self.gui.library_view.model().db cover_changed = False current_idx = self.gui.library_view.currentIndex() - if not current_idx.isValid(): return - cid = db.id(current_idx.row()) + if cid is None: + if not current_idx.isValid(): return + cid = db.id(current_idx.row()) if cid is None else cid for path in paths: ext = os.path.splitext(path)[1].lower() if ext: @@ -227,8 +241,9 @@ class AddAction(InterfaceAction): elif ext in BOOK_EXTENSIONS: db.add_format_with_hooks(cid, ext, path, index_is_id=True) accept = True - if accept: + if accept and event is not None: event.accept() + if current_idx.isValid(): self.gui.library_view.model().current_changed(current_idx, current_idx) if cover_changed: if self.gui.cover_flow: diff --git a/src/calibre/gui2/add_wizard/__init__.py b/src/calibre/gui2/add_wizard/__init__.py index da1879ae97..5df3f601a0 100644 --- a/src/calibre/gui2/add_wizard/__init__.py +++ b/src/calibre/gui2/add_wizard/__init__.py @@ -11,7 +11,6 @@ from PyQt4.Qt import QWizard, QWizardPage, QIcon, QPixmap, Qt, QThread, \ pyqtSignal from calibre.gui2 import error_dialog, choose_dir, gprefs -from calibre.constants import filesystem_encoding from calibre.library.add_to_library import find_folders_under, \ find_books_in_folder, hash_merge_format_collections @@ -122,20 +121,19 @@ class WelcomePage(WizardPage, WelcomeWidget): x = unicode(self.opt_root_folder.text()).strip() if not x: return None - return os.path.abspath(x.encode(filesystem_encoding)) + return os.path.abspath(x) def get_one_per_folder(self): return self.opt_one_per_folder.isChecked() def validatePage(self): x = self.get_root_folder() - xu = x.decode(filesystem_encoding) if x and os.access(x, os.R_OK) and os.path.isdir(x): - gprefs['add wizard root folder'] = xu + gprefs['add wizard root folder'] = x gprefs['add wizard one per folder'] = self.get_one_per_folder() return True error_dialog(self, _('Invalid root folder'), - xu + _('is not a valid root folder'), show=True) + x + _('is not a valid root folder'), show=True) return False # }}} diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 63deccb2f0..a28759486e 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, collections, sys +import collections, sys from Queue import Queue from PyQt4.Qt import QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl, \ @@ -14,7 +14,8 @@ from PyQt4.Qt import QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl, \ from PyQt4.QtWebKit import QWebView from calibre import fit_image, prepare_string_for_xml -from calibre.gui2.widgets import IMAGE_EXTENSIONS +from calibre.gui2.dnd import dnd_has_image, dnd_get_image, dnd_get_files, \ + IMAGE_EXTENSIONS, dnd_has_extension from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html @@ -165,11 +166,12 @@ class CoverView(QWidget): # {{{ def copy_to_clipboard(self): QApplication.instance().clipboard().setPixmap(self.pixmap) - def paste_from_clipboard(self): - cb = QApplication.instance().clipboard() - pmap = cb.pixmap() - if pmap.isNull() and cb.supportsSelection(): - pmap = cb.pixmap(cb.Selection) + def paste_from_clipboard(self, pmap=None): + if not isinstance(pmap, QPixmap): + cb = QApplication.instance().clipboard() + pmap = cb.pixmap() + if pmap.isNull() and cb.supportsSelection(): + pmap = cb.pixmap(cb.Selection) if not pmap.isNull(): self.pixmap = pmap self.do_layout() @@ -226,6 +228,7 @@ class BookInfo(QWebView): self._link_clicked = False self.setAttribute(Qt.WA_OpaquePaintEvent, False) palette = self.palette() + self.setAcceptDrops(False) palette.setBrush(QPalette.Base, Qt.transparent) self.page().setPalette(palette) @@ -388,36 +391,50 @@ class BookDetails(QWidget): # {{{ show_book_info = pyqtSignal() open_containing_folder = pyqtSignal(int) view_specific_format = pyqtSignal(int, object) - - # Drag 'n drop {{{ - DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS + remote_file_dropped = pyqtSignal(object, object) files_dropped = pyqtSignal(object, object) cover_changed = pyqtSignal(object, object) - # application/x-moz-file-promise-url - @classmethod - def paths_from_event(cls, event): - ''' - Accept a drop event and return a list of paths that can be read from - and represent files with extensions. - ''' - if event.mimeData().hasFormat('text/uri-list'): - urls = [unicode(u.toLocalFile()) for u in event.mimeData().urls()] - urls = [u for u in urls if os.path.splitext(u)[1] and os.access(u, os.R_OK)] - return [u for u in urls if os.path.splitext(u)[1][1:].lower() in cls.DROPABBLE_EXTENSIONS] + # Drag 'n drop {{{ + DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS def dragEnterEvent(self, event): - if int(event.possibleActions() & Qt.CopyAction) + \ - int(event.possibleActions() & Qt.MoveAction) == 0: - return - paths = self.paths_from_event(event) - if paths: + md = event.mimeData() + if dnd_has_extension(md, self.DROPABBLE_EXTENSIONS) or \ + dnd_has_image(md): event.acceptProposedAction() def dropEvent(self, event): - paths = self.paths_from_event(event) event.setDropAction(Qt.CopyAction) - self.files_dropped.emit(event, paths) + md = event.mimeData() + + x, y = dnd_get_image(md) + if x is not None: + # We have an image, set cover + event.accept() + if y is None: + # Local image + self.cover_view.paste_from_clipboard(x) + else: + self.remote_file_dropped.emit(x, y) + # We do not support setting cover *and* adding formats for + # a remote drop, anyway, so return + return + + # Now look for ebook files + urls, filenames = dnd_get_files(md, BOOK_EXTENSIONS) + if not urls: + # Nothing found + return + + if not filenames: + # Local files + self.files_dropped.emit(event, urls) + else: + # Remote files, use the first file + self.remote_file_dropped.emit(urls[0], filenames[0]) + event.accept() + def dragMoveEvent(self, event): event.acceptProposedAction() diff --git a/src/calibre/gui2/convert/xexp_edit.ui b/src/calibre/gui2/convert/xexp_edit.ui index 18b7c39b52..68c0c8c98e 100644 --- a/src/calibre/gui2/convert/xexp_edit.ui +++ b/src/calibre/gui2/convert/xexp_edit.ui @@ -43,6 +43,9 @@ 0 + + QComboBox::AdjustToMinimumContentsLengthWithIcon + 30 diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index fa7ba3c56d..beaca77a38 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -5,7 +5,6 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys from functools import partial from PyQt4.Qt import QComboBox, QLabel, QSpinBox, QDoubleSpinBox, QDateEdit, \ @@ -85,7 +84,7 @@ class Int(Base): self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), QSpinBox(parent)] w = self.widgets[1] - w.setRange(-100, sys.maxint) + w.setRange(-100, 100000000) w.setSpecialValueText(_('Undefined')) w.setSingleStep(1) @@ -108,7 +107,7 @@ class Float(Int): self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), QDoubleSpinBox(parent)] w = self.widgets[1] - w.setRange(-100., float(sys.maxint)) + w.setRange(-100., float(100000000)) w.setDecimals(2) w.setSpecialValueText(_('Undefined')) w.setSingleStep(1) @@ -289,7 +288,7 @@ class Series(Base): self.widgets.append(QLabel('&'+self.col_metadata['name']+_(' index:'), parent)) w = QDoubleSpinBox(parent) - w.setRange(-100., float(sys.maxint)) + w.setRange(-100., float(100000000)) w.setDecimals(2) w.setSpecialValueText(_('Undefined')) w.setSingleStep(1) @@ -595,7 +594,7 @@ class BulkInt(BulkBase): def setup_ui(self, parent): self.make_widgets(parent, QSpinBox) - self.main_widget.setRange(-100, sys.maxint) + self.main_widget.setRange(-100, 100000000) self.main_widget.setSpecialValueText(_('Undefined')) self.main_widget.setSingleStep(1) @@ -617,7 +616,7 @@ class BulkFloat(BulkInt): def setup_ui(self, parent): self.make_widgets(parent, QDoubleSpinBox) - self.main_widget.setRange(-100., float(sys.maxint)) + self.main_widget.setRange(-100., float(100000000)) self.main_widget.setDecimals(2) self.main_widget.setSpecialValueText(_('Undefined')) self.main_widget.setSingleStep(1) @@ -795,6 +794,7 @@ class BulkEnumeration(BulkBase, Enumeration): return value def setup_ui(self, parent): + self.parent = parent self.make_widgets(parent, QComboBox) vals = self.col_metadata['display']['enum_values'] self.main_widget.blockSignals(True) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 298e541730..2cbecc134c 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1160,6 +1160,14 @@ class DeviceMixin(object): # {{{ ), bad) d.exec_() + def upload_dirtied_booklists(self): + ''' + Upload metadata to device. + ''' + plugboards = self.library_view.model().db.prefs.get('plugboards', {}) + self.device_manager.sync_booklists(Dispatcher(lambda x: x), + self.booklists(), plugboards) + def upload_booklists(self): ''' Upload metadata to device. diff --git a/src/calibre/gui2/dialogs/choose_plugin_toolbars.py b/src/calibre/gui2/dialogs/choose_plugin_toolbars.py new file mode 100644 index 0000000000..ddf8e162e8 --- /dev/null +++ b/src/calibre/gui2/dialogs/choose_plugin_toolbars.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' +__license__ = 'GPL v3' + + +from PyQt4.Qt import QDialog, QVBoxLayout, QLabel, QDialogButtonBox, \ + QListWidget, QAbstractItemView +from PyQt4 import QtGui + +class ChoosePluginToolbarsDialog(QDialog): + + def __init__(self, parent, plugin, locations): + QDialog.__init__(self, parent) + self.locations = locations + + self.setWindowTitle( + _('Add "%s" to toolbars or menus')%plugin.name) + + self._layout = QVBoxLayout(self) + self.setLayout(self._layout) + + self._header_label = QLabel( + _('Select the toolbars and/or menus to add %s to:') % + plugin.name) + self._layout.addWidget(self._header_label) + + self._locations_list = QListWidget(self) + self._locations_list.setSelectionMode(QAbstractItemView.MultiSelection) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + self._locations_list.setSizePolicy(sizePolicy) + for key, text in locations: + self._locations_list.addItem(text) + self._layout.addWidget(self._locations_list) + + self._footer_label = QLabel( + _('You can also customise the plugin locations ' + 'using Preferences -> Customise the toolbar')) + self._layout.addWidget(self._footer_label) + + button_box = QDialogButtonBox(QDialogButtonBox.Ok | + QDialogButtonBox.Cancel) + button_box.accepted.connect(self.accept) + button_box.rejected.connect(self.reject) + self._layout.addWidget(button_box) + self.resize(self.sizeHint()) + + def selected_locations(self): + selected = [] + for row in self._locations_list.selectionModel().selectedRows(): + selected.append(self.locations[row.row()]) + return selected + diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index c1627d7e12..d918991aad 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -7,7 +7,7 @@ import re, os, inspect from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \ pyqtSignal, QDialogButtonBox, QInputDialog, QLineEdit, \ - QDate + QDate, QCompleter from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor @@ -364,7 +364,8 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): (fm[f]['datatype'] in ['text', 'series', 'enumeration'] and fm[f].get('search_terms', None) and f not in ['formats', 'ondevice']) or - fm[f]['datatype'] in ['int', 'float', 'bool'] ): + (fm[f]['datatype'] in ['int', 'float', 'bool'] and + f not in ['id'])): self.all_fields.append(f) self.writable_fields.append(f) if fm[f]['datatype'] == 'composite': @@ -393,6 +394,14 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.book_1_text.setObjectName(name) self.testgrid.addWidget(w, i+offset, 2, 1, 1) + ident_types = sorted(self.db.get_all_identifier_types(), key=sort_key) + self.s_r_dst_ident.setCompleter(QCompleter(ident_types)) + try: + self.s_r_dst_ident.setPlaceholderText(_('Enter an identifier type')) + except: + pass + self.s_r_src_ident.addItems(ident_types) + self.main_heading = _( 'You can destroy your library using this feature. ' 'Changes are permanent. There is no undo function. ' @@ -449,6 +458,8 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.test_text.editTextChanged[str].connect(self.s_r_paint_results) self.comma_separated.stateChanged.connect(self.s_r_paint_results) self.case_sensitive.stateChanged.connect(self.s_r_paint_results) + self.s_r_src_ident.currentIndexChanged[int].connect(self.s_r_paint_results) + self.s_r_dst_ident.textChanged.connect(self.s_r_paint_results) self.s_r_template.lost_focus.connect(self.s_r_template_changed) self.central_widget.setCurrentIndex(0) @@ -471,6 +482,8 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.query_field.addItems(sorted([q for q in self.queries], key=sort_key)) self.query_field.currentIndexChanged[str].connect(self.s_r_query_change) self.query_field.setCurrentIndex(0) + self.search_field.setCurrentIndex(0) + self.s_r_search_field_changed(0) def s_r_sf_itemdata(self, idx): if idx is None: @@ -495,6 +508,13 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): val = mi.get(field, None) if isinstance(val, (int, float, bool)): val = str(val) + elif fm['is_csp']: + # convert the csp dict into a list + id_type = unicode(self.s_r_src_ident.currentText()) + if id_type: + val = [val.get(id_type, '')] + else: + val = [u'%s:%s'%(t[0], t[1]) for t in val.iteritems()] if val is None: val = [] if fm['is_multiple'] else [''] elif not fm['is_multiple']: @@ -512,12 +532,17 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.s_r_search_field_changed(self.search_field.currentIndex()) def s_r_search_field_changed(self, idx): - if self.search_mode.currentIndex() != 0 and idx == 1: # Template + self.s_r_template.setVisible(False) + self.template_label.setVisible(False) + self.s_r_src_ident_label.setVisible(False) + self.s_r_src_ident.setVisible(False) + if idx == 1: # Template self.s_r_template.setVisible(True) self.template_label.setVisible(True) - else: - self.s_r_template.setVisible(False) - self.template_label.setVisible(False) + elif self.s_r_sf_itemdata(idx) == 'identifiers': + self.s_r_src_ident_label.setVisible(True) + self.s_r_src_ident.setVisible(True) + for i in range(0, self.s_r_number_of_books): w = getattr(self, 'book_%d_text'%(i+1)) mi = self.db.get_metadata(self.ids[i], index_is_id=True) @@ -535,10 +560,15 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.s_r_paint_results(None) def s_r_destination_field_changed(self, idx): + self.s_r_dst_ident_label.setVisible(False) + self.s_r_dst_ident.setVisible(False) txt = self.s_r_df_itemdata(idx) if not txt: txt = self.s_r_sf_itemdata(None) if txt and txt in self.writable_fields: + if txt == 'identifiers': + self.s_r_dst_ident_label.setVisible(True) + self.s_r_dst_ident.setVisible(True) self.destination_field_fm = self.db.metadata_for_field(txt) self.s_r_paint_results(None) @@ -617,6 +647,10 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): dest = src dest_mode = self.replace_mode.currentIndex() + if self.destination_field_fm['is_csp']: + if not unicode(self.s_r_dst_ident.text()): + raise Exception(_('You must specify a destination identifier type')) + if self.destination_field_fm['is_multiple']: if self.comma_separated.isChecked(): if dest == 'authors': @@ -635,6 +669,13 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): if dest_mode != 0: dest_val = mi.get(dest, '') + if self.db.metadata_for_field(dest)['is_csp']: + dst_id_type = unicode(self.s_r_dst_ident.text()) + if dst_id_type: + dest_val = [dest_val.get(dst_id_type, '')] + else: + # convert the csp dict into a list + dest_val = [u'%s:%s'%(t[0], t[1]) for t in dest_val.iteritems()] if dest_val is None: dest_val = [] elif not isinstance(dest_val, list): @@ -717,6 +758,17 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): 'Book title %s not processed')%mi.title, show=True) return + # convert the colon-separated pair strings back into a dict, which + # is what set_identifiers wants + if dfm['is_csp']: + dst_id_type = unicode(self.s_r_dst_ident.text()) + if dst_id_type: + v = ''.join(val) + ids = mi.get(dest) + ids[dst_id_type] = v + val = ids + else: + val = dict([(t.split(':')) for t in val]) else: val = self.s_r_replace_mode_separator().join(val) if dest == 'title' and len(val) == 0: @@ -961,11 +1013,13 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): query['search_field'] = unicode(self.search_field.currentText()) query['search_mode'] = unicode(self.search_mode.currentText()) query['s_r_template'] = unicode(self.s_r_template.text()) + query['s_r_src_ident'] = unicode(self.s_r_src_ident.currentText()) query['search_for'] = unicode(self.search_for.text()) query['case_sensitive'] = self.case_sensitive.isChecked() query['replace_with'] = unicode(self.replace_with.text()) query['replace_func'] = unicode(self.replace_func.currentText()) query['destination_field'] = unicode(self.destination_field.currentText()) + query['s_r_dst_ident'] = unicode(self.s_r_dst_ident.text()) query['replace_mode'] = unicode(self.replace_mode.currentText()) query['comma_separated'] = self.comma_separated.isChecked() query['results_count'] = self.results_count.value() @@ -992,37 +1046,61 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.s_r_reset_query_fields() return - def set_index(attr, txt): + def set_text(attr, key): try: - attr.setCurrentIndex(attr.findText(txt)) + attr.setText(item[key]) + except: + pass + + def set_checked(attr, key): + try: + attr.setChecked(item[key]) + except: + attr.setChecked(False) + + def set_value(attr, key): + try: + attr.setValue(int(item[key])) + except: + attr.setValue(0) + + def set_index(attr, key): + try: + attr.setCurrentIndex(attr.findText(item[key])) except: attr.setCurrentIndex(0) - set_index(self.search_mode, item['search_mode']) - set_index(self.search_field, item['search_field']) - self.s_r_template.setText(item['s_r_template']) + set_index(self.search_mode, 'search_mode') + set_index(self.search_field, 'search_field') + set_text(self.s_r_template, 's_r_template') + self.s_r_template_changed() #simulate gain/loss of focus - self.search_for.setText(item['search_for']) - self.case_sensitive.setChecked(item['case_sensitive']) - self.replace_with.setText(item['replace_with']) - set_index(self.replace_func, item['replace_func']) - set_index(self.destination_field, item['destination_field']) - set_index(self.replace_mode, item['replace_mode']) - self.comma_separated.setChecked(item['comma_separated']) - self.results_count.setValue(int(item['results_count'])) - self.starting_from.setValue(int(item['starting_from'])) - self.multiple_separator.setText(item['multiple_separator']) + + set_index(self.s_r_src_ident, 's_r_src_ident'); + set_text(self.s_r_dst_ident, 's_r_dst_ident') + set_text(self.search_for, 'search_for') + set_checked(self.case_sensitive, 'case_sensitive') + set_text(self.replace_with, 'replace_with') + set_index(self.replace_func, 'replace_func') + set_index(self.destination_field, 'destination_field') + set_index(self.replace_mode, 'replace_mode') + set_checked(self.comma_separated, 'comma_separated') + set_value(self.results_count, 'results_count') + set_value(self.starting_from, 'starting_from') + set_text(self.multiple_separator, 'multiple_separator') def s_r_reset_query_fields(self): # Don't reset the search mode. The user will probably want to use it # as it was self.search_field.setCurrentIndex(0) + self.s_r_src_ident.setCurrentIndex(0) self.s_r_template.setText("") self.search_for.setText("") self.case_sensitive.setChecked(False) self.replace_with.setText("") self.replace_func.setCurrentIndex(0) self.destination_field.setCurrentIndex(0) + self.s_r_dst_ident.setText('') self.replace_mode.setCurrentIndex(0) self.comma_separated.setChecked(True) self.results_count.setValue(999) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 1654ff8261..59a68d6514 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -732,6 +732,29 @@ Future conversion of these books will use the default settings. + + + + Identifier type: + + + s_r_src_ident + + + + + + + + 100 + 0 + + + + Choose which identifier type to operate upon + + + @@ -910,7 +933,30 @@ not multiple and the destination field is multiple - + + + + Identifier type: + + + s_r_dst_ident + + + + + + + + 100 + 0 + + + + Choose which identifier type to operate upon + + + + @@ -996,7 +1042,7 @@ not multiple and the destination field is multiple - + QFrame::NoFrame @@ -1120,6 +1166,7 @@ not multiple and the destination field is multiple remove_button search_field search_mode + s_r_src_ident s_r_template search_for case_sensitive @@ -1128,6 +1175,7 @@ not multiple and the destination field is multiple destination_field replace_mode comma_separated + s_r_dst_ident results_count starting_from multiple_separator diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index d95c905f42..9efe7f7160 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -12,7 +12,7 @@ from threading import Thread from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QDate, \ QPixmap, QListWidgetItem, QDialog, pyqtSignal, QIcon, \ - QPushButton + QPushButton, QKeySequence from calibre.gui2 import error_dialog, file_icon_provider, dynamic, \ choose_files, choose_images, ResizableDialog, \ @@ -472,17 +472,19 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'), self) self.button_box.addButton(self.prev_button, self.button_box.ActionRole) - tip = _('Save changes and edit the metadata of %s')%prev + tip = (_('Save changes and edit the metadata of %s')+' [Alt+Left]')%prev self.prev_button.setToolTip(tip) self.prev_button.clicked.connect(partial(self.next_triggered, -1)) + self.prev_button.setShortcut(QKeySequence('Alt+Left')) if next_: self.next_button = QPushButton(QIcon(I('forward.png')), _('Next'), self) self.button_box.addButton(self.next_button, self.button_box.ActionRole) - tip = _('Save changes and edit the metadata of %s')%next_ + tip = (_('Save changes and edit the metadata of %s')+' [Alt+Right]')%next_ self.next_button.setToolTip(tip) self.next_button.clicked.connect(partial(self.next_triggered, 1)) + self.next_button.setShortcut(QKeySequence('Alt+Right')) self.splitter.setStretchFactor(100, 1) self.read_state() diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index f2388d2981..5453a90766 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -4,7 +4,7 @@ __copyright__ = '2008, Kovid Goyal ' import time, os from PyQt4.Qt import SIGNAL, QUrl, QAbstractListModel, Qt, \ - QVariant + QVariant, QFont from calibre.web.feeds.recipes import compile_recipe, custom_recipes from calibre.web.feeds.news import AutomaticNewsRecipe @@ -83,6 +83,9 @@ class UserProfiles(ResizableDialog, Ui_Dialog): self._model = self.model = CustomRecipeModel(recipe_model) self.available_profiles.setModel(self._model) self.available_profiles.currentChanged = self.current_changed + f = QFont() + f.setStyleHint(f.Monospace) + self.source_code.setFont(f) self.connect(self.remove_feed_button, SIGNAL('clicked(bool)'), self.added_feeds.remove_selected_items) diff --git a/src/calibre/gui2/dialogs/user_profiles.ui b/src/calibre/gui2/dialogs/user_profiles.ui index 97e3d37db2..7631c74768 100644 --- a/src/calibre/gui2/dialogs/user_profiles.ui +++ b/src/calibre/gui2/dialogs/user_profiles.ui @@ -410,11 +410,6 @@ p, li { white-space: pre-wrap; } 0 - - - DejaVu Sans Mono - - QTextEdit::NoWrap diff --git a/src/calibre/gui2/dnd.py b/src/calibre/gui2/dnd.py new file mode 100644 index 0000000000..928de72578 --- /dev/null +++ b/src/calibre/gui2/dnd.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +__license__ = 'GPL v3' +__copyright__ = '2011, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import posixpath, os, urllib, re +from urlparse import urlparse, urlunparse +from threading import Thread +from Queue import Queue, Empty + +from PyQt4.Qt import QPixmap, Qt, QDialog, QLabel, QVBoxLayout, \ + QDialogButtonBox, QProgressBar, QTimer + +from calibre.constants import DEBUG, iswindows +from calibre.ptempfile import PersistentTemporaryFile +from calibre import browser, as_unicode, prints +from calibre.gui2 import error_dialog + +IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'gif', 'png', 'bmp'] + +class Worker(Thread): # {{{ + + def __init__(self, url, fpath, rq): + Thread.__init__(self) + self.url, self.fpath = url, fpath + self.daemon = True + self.rq = rq + self.err = self.tb = None + + def run(self): + try: + br = browser() + br.retrieve(self.url, self.fpath, self.callback) + except Exception, e: + self.err = as_unicode(e) + import traceback + self.tb = traceback.format_exc() + + def callback(self, a, b, c): + self.rq.put((a, b, c)) +# }}} + +class DownloadDialog(QDialog): # {{{ + + def __init__(self, url, fname, parent): + QDialog.__init__(self, parent) + self.setWindowTitle(_('Download %s')%fname) + self.l = QVBoxLayout(self) + self.purl = urlparse(url) + self.msg = QLabel(_('Downloading %s from %s')%(fname, + self.purl.netloc)) + self.msg.setWordWrap(True) + self.l.addWidget(self.msg) + self.pb = QProgressBar(self) + self.pb.setMinimum(0) + self.pb.setMaximum(0) + self.l.addWidget(self.pb) + self.bb = QDialogButtonBox(QDialogButtonBox.Cancel, Qt.Horizontal, self) + self.l.addWidget(self.bb) + self.bb.rejected.connect(self.reject) + sz = self.sizeHint() + self.resize(max(sz.width(), 400), sz.height()) + + fpath = PersistentTemporaryFile(os.path.splitext(fname)[1]) + fpath.close() + self.fpath = fpath.name + + self.worker = Worker(url, self.fpath, Queue()) + self.rejected = False + + def reject(self): + self.rejected = True + QDialog.reject(self) + + def start_download(self): + self.worker.start() + QTimer.singleShot(50, self.update) + self.exec_() + if self.worker.err is not None: + error_dialog(self.parent(), _('Download failed'), + _('Failed to download from %r with error: %s')%( + self.worker.url, self.worker.err), + det_msg=self.worker.tb, show=True) + + def update(self): + if self.rejected: + return + + try: + progress = self.worker.rq.get_nowait() + except Empty: + pass + else: + self.update_pb(progress) + + if not self.worker.is_alive(): + return self.accept() + QTimer.singleShot(50, self.update) + + def update_pb(self, progress): + transferred, block_size, total = progress + if total == -1: + self.pb.setMaximum(0) + self.pb.setMinimum(0) + self.pb.setValue(0) + else: + so_far = transferred * block_size + self.pb.setMaximum(max(total, so_far)) + self.pb.setValue(so_far) + + @property + def err(self): + return self.worker.err + +# }}} + +def dnd_has_image(md): + return md.hasImage() + +def data_as_string(f, md): + raw = bytes(md.data(f)) + if '/x-moz' in f: + try: + raw = raw.decode('utf-16') + except: + pass + return raw + +def dnd_has_extension(md, extensions): + if DEBUG: + prints('Debugging DND event') + for f in md.formats(): + f = unicode(f) + prints(f, repr(data_as_string(f, md))[:300], '\n') + print () + if has_firefox_ext(md, extensions): + return True + if md.hasUrls(): + urls = [unicode(u.toString()) for u in + md.urls()] + purls = [urlparse(u) for u in urls] + if DEBUG: + prints('URLS:', urls) + prints('Paths:', [u2p(x) for x in purls]) + + exts = frozenset([posixpath.splitext(u.path)[1][1:].lower() for u in + purls]) + return bool(exts.intersection(frozenset(extensions))) + return False + +def u2p(url): + path = url.path + if iswindows: + if path.startswith('/'): + path = path[1:] + ans = path.replace('/', os.sep) + if os.path.exists(ans): + return ans + # Try unquoting the URL + return urllib.unquote(ans) + +def dnd_get_image(md, image_exts=IMAGE_EXTENSIONS): + ''' + Get the image in the QMimeData object md. + + :return: None, None if no image is found + QPixmap, None if an image is found, the pixmap is guaranteed not + null + url, filename if a URL that points to an image is found + ''' + if dnd_has_image(md): + for x in md.formats(): + x = unicode(x) + if x.startswith('image/'): + cdata = bytes(md.data(x)) + pmap = QPixmap() + pmap.loadFromData(cdata) + if not pmap.isNull(): + return pmap, None + break + + # No image, look for a URL pointing to an image + if md.hasUrls(): + urls = [unicode(u.toString()) for u in + md.urls()] + purls = [urlparse(u) for u in urls] + # First look for a local file + images = [u2p(x) for x in purls if x.scheme in ('', 'file') and + posixpath.splitext(urllib.unquote(x.path))[1][1:].lower() in + image_exts] + images = [x for x in images if os.path.exists(x)] + p = QPixmap() + for path in images: + try: + with open(path, 'rb') as f: + p.loadFromData(f.read()) + except: + continue + if not p.isNull(): + return p, None + + # No local images, look for remote ones + + # First, see if this is from Firefox + rurl, fname = get_firefox_rurl(md, image_exts) + + if rurl and fname: + return rurl, fname + # Look through all remaining URLs + remote_urls = [x for x in purls if x.scheme in ('http', 'https', + 'ftp') and posixpath.splitext(x.path)[1][1:].lower() in image_exts] + if remote_urls: + rurl = remote_urls[0] + fname = posixpath.basename(urllib.unquote(rurl.path)) + return urlunparse(rurl), fname + + return None, None + +def dnd_get_files(md, exts): + ''' + Get the file in the QMimeData object md with an extension that is one of + the extensions in exts. + + :return: None, None if no file is found + [paths], None if a local file is found + [urls], [filenames] if URLs that point to a files are found + ''' + # Look for a URL pointing to a file + if md.hasUrls(): + urls = [unicode(u.toString()) for u in + md.urls()] + purls = [urlparse(u) for u in urls] + # First look for a local file + local_files = [u2p(x) for x in purls if x.scheme in ('', 'file') and + posixpath.splitext(urllib.unquote(x.path))[1][1:].lower() in + exts] + local_files = [x for x in local_files if os.path.exists(x)] + if local_files: + return local_files, None + + # No local files, look for remote ones + + # First, see if this is from Firefox + rurl, fname = get_firefox_rurl(md, exts) + if rurl and fname: + return [rurl], [fname] + + # Look through all remaining URLs + remote_urls = [x for x in purls if x.scheme in ('http', 'https', + 'ftp') and posixpath.splitext(x.path)[1][1:].lower() in exts] + if remote_urls: + filenames = [posixpath.basename(urllib.unquote(rurl.path)) for rurl in + remote_urls] + return [urlunparse(x) for x in remote_urls], filenames + + return None, None + +def _get_firefox_pair(md, exts, url, fname): + url = bytes(md.data(url)).decode('utf-16') + fname = bytes(md.data(fname)).decode('utf-16') + while url.endswith('\x00'): + url = url[:-1] + while fname.endswith('\x00'): + fname = fname[:-1] + if not url or not fname: + return None, None + ext = posixpath.splitext(fname)[1][1:].lower() + # Weird firefox bug on linux + ext = {'jpe':'jpg', 'epu':'epub', 'mob':'mobi'}.get(ext, ext) + fname = os.path.splitext(fname)[0] + '.' + ext + if DEBUG: + prints('Firefox file promise:', url, fname) + if ext not in exts: + fname = url = None + return url, fname + + +def get_firefox_rurl(md, exts): + formats = frozenset([unicode(x) for x in md.formats()]) + url = fname = None + if 'application/x-moz-file-promise-url' in formats and \ + 'application/x-moz-file-promise-dest-filename' in formats: + try: + url, fname = _get_firefox_pair(md, exts, + 'application/x-moz-file-promise-url', + 'application/x-moz-file-promise-dest-filename') + except: + if DEBUG: + import traceback + traceback.print_exc() + if url is None and 'text/x-moz-url-data' in formats and \ + 'text/x-moz-url-desc' in formats: + try: + url, fname = _get_firefox_pair(md, exts, + 'text/x-moz-url-data', 'text/x-moz-url-desc') + except: + if DEBUG: + import traceback + traceback.print_exc() + + if url is None and '_NETSCAPE_URL' in formats: + try: + raw = bytes(md.data('_NETSCAPE_URL')) + raw = raw.decode('utf-8') + lines = raw.splitlines() + if len(lines) > 1 and re.match(r'[a-z]+://', lines[1]) is None: + url, fname = lines[:2] + ext = posixpath.splitext(fname)[1][1:].lower() + if ext not in exts: + fname = url = None + except: + if DEBUG: + import traceback + traceback.print_exc() + if DEBUG: + prints('Firefox rurl:', url, fname) + return url, fname + +def has_firefox_ext(md, exts): + return bool(get_firefox_rurl(md, exts)[0]) + diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index e8c2712c83..80f1f1c2cf 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -44,13 +44,13 @@ class LibraryViewMixin(object): # {{{ for view in (self.library_view, self.memory_view, self.card_a_view, self.card_b_view): getattr(view, func)(*args) - self.memory_view.connect_dirtied_signal(self.upload_booklists) + self.memory_view.connect_dirtied_signal(self.upload_dirtied_booklists) self.memory_view.connect_upload_collections_signal( func=self.upload_collections, oncard=None) - self.card_a_view.connect_dirtied_signal(self.upload_booklists) + self.card_a_view.connect_dirtied_signal(self.upload_dirtied_booklists) self.card_a_view.connect_upload_collections_signal( func=self.upload_collections, oncard='carda') - self.card_b_view.connect_dirtied_signal(self.upload_booklists) + self.card_b_view.connect_dirtied_signal(self.upload_dirtied_booklists) self.card_b_view.connect_upload_collections_signal( func=self.upload_collections, oncard='cardb') self.book_on_device(None, reset=True) @@ -264,6 +264,9 @@ class LayoutMixin(object): # {{{ self.book_details.files_dropped.connect(self.iactions['Add Books'].files_dropped_on_book) self.book_details.cover_changed.connect(self.bd_cover_changed, type=Qt.QueuedConnection) + self.book_details.remote_file_dropped.connect( + self.iactions['Add Books'].remote_file_dropped_on_book, + type=Qt.QueuedConnection) self.book_details.open_containing_folder.connect(self.iactions['View'].view_folder_for_id) self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id) diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index 87da6818eb..3a090f8102 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -5,7 +5,6 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys from math import cos, sin, pi from PyQt4.Qt import QColor, Qt, QModelIndex, QSize, \ @@ -245,13 +244,13 @@ class CcTextDelegate(QStyledItemDelegate): # {{{ typ = m.custom_columns[col]['datatype'] if typ == 'int': editor = QSpinBox(parent) - editor.setRange(-100, sys.maxint) + editor.setRange(-100, 100000000) editor.setSpecialValueText(_('Undefined')) editor.setSingleStep(1) elif typ == 'float': editor = QDoubleSpinBox(parent) editor.setSpecialValueText(_('Undefined')) - editor.setRange(-100., float(sys.maxint)) + editor.setRange(-100., 100000000) editor.setDecimals(2) else: editor = MultiCompleteLineEdit(parent) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index b782cc7c72..0658c0604a 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -22,7 +22,7 @@ from calibre.utils.icu import sort_key, strcmp as icu_strcmp from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.utils.search_query_parser import SearchQueryParser from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ - REGEXP_MATCH, MetadataBackup + REGEXP_MATCH, MetadataBackup, force_to_bool from calibre import strftime, isbytestring, prepare_string_for_xml from calibre.constants import filesystem_encoding, DEBUG from calibre.gui2.library import DEFAULT_SORT @@ -268,6 +268,15 @@ class BooksModel(QAbstractTableModel): # {{{ return None return self.get_current_highlighted_id() + def highlight_ids(self, ids_to_highlight): + self.ids_to_highlight = ids_to_highlight + self.ids_to_highlight_set = set(self.ids_to_highlight) + if self.ids_to_highlight: + self.current_highlighted_idx = 0 + else: + self.current_highlighted_idx = None + self.reset() + def search(self, text, reset=True): try: if self.highlight_only: @@ -615,20 +624,7 @@ class BooksModel(QAbstractTableModel): # {{{ return None # displayed using a decorator def bool_type_decorator(r, idx=-1, bool_cols_are_tristate=True): - val = self.db.data[r][idx] - if isinstance(val, (str, unicode)): - try: - val = icu_lower(val) - if not val: - val = None - elif val in [_('yes'), _('checked'), 'true']: - val = True - elif val in [_('no'), _('unchecked'), 'false']: - val = False - else: - val = bool(int(val)) - except: - val = None + val = force_to_bool(self.db.data[r][idx]) if not bool_cols_are_tristate: if val is None or not val: return self.bool_no_icon diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 0fa5c746e7..3b6dd0e253 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -11,7 +11,7 @@ from functools import partial from PyQt4.Qt import Qt, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, \ QGridLayout, pyqtSignal, QDialogButtonBox, QScrollArea, QFont, \ QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, \ - QSizePolicy, QPalette, QFrame, QSize + QSizePolicy, QPalette, QFrame, QSize, QKeySequence from calibre.ebooks.metadata import authors_to_string, string_to_authors from calibre.gui2 import ResizableDialog, error_dialog, gprefs @@ -45,9 +45,12 @@ class MetadataSingleDialogBase(ResizableDialog): self.button_box.rejected.connect(self.reject) self.next_button = QPushButton(QIcon(I('forward.png')), _('Next'), self) + self.next_button.setShortcut(QKeySequence('Alt+Right')) self.next_button.clicked.connect(partial(self.do_one, delta=1)) self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'), self) + self.prev_button.setShortcut(QKeySequence('Alt+Left')) + self.button_box.addButton(self.prev_button, self.button_box.ActionRole) self.button_box.addButton(self.next_button, self.button_box.ActionRole) self.prev_button.clicked.connect(partial(self.do_one, delta=-1)) @@ -355,11 +358,13 @@ class MetadataSingleDialogBase(ResizableDialog): next_ = self.db.title(self.row_list[self.current_row+1]) if next_ is not None: - tip = _('Save changes and edit the metadata of %s')%next_ + tip = (_('Save changes and edit the metadata of %s')+ + ' [Alt+Right]')%next_ self.next_button.setToolTip(tip) self.next_button.setVisible(next_ is not None) if prev is not None: - tip = _('Save changes and edit the metadata of %s')%prev + tip = (_('Save changes and edit the metadata of %s')+ + ' [Alt+Left]')%prev self.prev_button.setToolTip(tip) self.prev_button.setVisible(prev is not None) self(self.db.id(self.row_list[self.current_row])) diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 50d567d239..8909bc7b3d 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -169,6 +169,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): col = unicode(self.column_name_box.text()).strip() if not col: return self.simple_error('', _('No lookup name was provided')) + if col.startswith('#'): + col = col[1:] 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')) diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 94f3bae3dc..cc7821d1fe 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -16,9 +16,10 @@ from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin disable_plugin, plugin_customization, add_plugin, \ remove_plugin from calibre.gui2 import NONE, error_dialog, info_dialog, choose_files, \ - question_dialog + question_dialog, gprefs from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.icu import lower +from calibre.utils.ordered_dict import OrderedDict class PluginModel(QAbstractItemModel, SearchQueryParser): # {{{ @@ -282,6 +283,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self._plugin_model.populate() self._plugin_model.reset() self.changed_signal.emit() + self.check_for_add_to_toolbars(plugin) info_dialog(self, _('Success'), _('Plugin {0} successfully installed under ' ' {1} plugins. You may have to restart calibre ' @@ -348,6 +350,38 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): if self.gui.iactions.has_key('Store'): self.gui.iactions['Store'].load_menu() + def check_for_add_to_toolbars(self, plugin): + from calibre.gui2.preferences.toolbar import ConfigWidget + from calibre.customize import InterfaceActionBase + + if not isinstance(plugin, InterfaceActionBase): + return + + all_locations = OrderedDict(ConfigWidget.LOCATIONS) + plugin_action = plugin.load_actual_plugin(self.gui) + installed_actions = OrderedDict([ + (key, list(gprefs.get('action-layout-'+key, []))) + for key in all_locations]) + + # If already installed in a GUI container, do nothing + for action_names in installed_actions.itervalues(): + if plugin_action.name in action_names: + return + + allowed_locations = [(key, text) for key, text in + all_locations.iteritems() if key + not in plugin_action.dont_add_to] + if not allowed_locations: + return # This plugin doesn't want to live in the GUI + + from calibre.gui2.dialogs.choose_plugin_toolbars import ChoosePluginToolbarsDialog + d = ChoosePluginToolbarsDialog(self, plugin_action, allowed_locations) + if d.exec_() == d.Accepted: + for key, text in d.selected_locations(): + installed_actions = list(gprefs.get('action-layout-'+key, [])) + installed_actions.append(plugin_action.name) + gprefs['action-layout-'+key] = tuple(installed_actions) + if __name__ == '__main__': from PyQt4.Qt import QApplication diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 5a4c34a5cd..5b8501ebb5 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -436,17 +436,18 @@ class SavedSearchBoxMixin(object): # {{{ b = getattr(self, x+'_search_button') b.setStatusTip(b.toolTip()) - def saved_searches_changed(self): + def saved_searches_changed(self, set_restriction=None): p = sorted(saved_searches().names(), key=sort_key) - t = unicode(self.search_restriction.currentText()) + if set_restriction is None: + set_restriction = unicode(self.search_restriction.currentText()) # rebuild the restrictions combobox using current saved searches self.search_restriction.clear() self.search_restriction.addItem('') self.tags_view.recount() for s in p: self.search_restriction.addItem(s) - if t: # redo the search restriction if there was one - self.apply_named_search_restriction(t) + if set_restriction: # redo the search restriction if there was one + self.apply_named_search_restriction(set_restriction) def do_saved_search_edit(self, search): d = SavedSearchEditor(self, search) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 586715afd0..c4871880a4 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -246,7 +246,7 @@ class TagsView(QTreeView): # {{{ self.add_subcategory.emit(key) return if action == 'search_category': - self.tags_marked.emit(key + ':' + search_state) + self._toggle(index, set_to=search_state) return if action == 'delete_user_category': self.delete_user_category.emit(key) @@ -320,6 +320,9 @@ class TagsView(QTreeView): # {{{ self.context_menu.addAction(_('Edit sort for %s')%tag.name, partial(self.context_menu_handler, action='edit_author_sort', index=tag.id)) + + # is_editable is also overloaded to mean 'can be added + # to a user category' m = self.context_menu.addMenu(self.user_category_icon, _('Add %s to user category')%tag.name) nt = self.model().category_node_tree @@ -345,7 +348,7 @@ class TagsView(QTreeView): # {{{ partial(self.context_menu_handler, action='delete_item_from_user_category', key = key, index = tag_item)) - # Add the search for value items + # Add the search for value items. All leaf nodes are searchable self.context_menu.addAction(self.search_icon, _('Search for %s')%tag.name, partial(self.context_menu_handler, action='search', @@ -373,7 +376,6 @@ class TagsView(QTreeView): # {{{ action='delete_user_category', key=key)) self.context_menu.addSeparator() # Hide/Show/Restore categories - #if not key.startswith('@') or key.find('.') < 0: self.context_menu.addAction(_('Hide category %s') % category, partial(self.context_menu_handler, action='hide', category=key)) @@ -384,16 +386,21 @@ class TagsView(QTreeView): # {{{ m.addAction(self.db.field_metadata[col]['name'], partial(self.context_menu_handler, action='show', category=col)) - # search by category - if key != 'search': + # search by category. Some categories are not searchable, such + # as search and news + if item.tag.is_searchable: self.context_menu.addAction(self.search_icon, _('Search for books in category %s')%category, - partial(self.context_menu_handler, action='search_category', - key=key, search_state='true')) + partial(self.context_menu_handler, + action='search_category', + index=self._model.createIndex(item.row(), 0, item), + search_state=TAG_SEARCH_STATES['mark_plus'])) self.context_menu.addAction(self.search_icon, _('Search for books not in category %s')%category, - partial(self.context_menu_handler, action='search_category', - key=key, search_state='false')) + partial(self.context_menu_handler, + action='search_category', + index=self._model.createIndex(item.row(), 0, item), + search_state=TAG_SEARCH_STATES['mark_minus'])) # Offer specific editors for tags/series/publishers/saved searches self.context_menu.addSeparator() if key in ['tags', 'publisher', 'series'] or \ @@ -559,8 +566,10 @@ class TagTreeItem(object): # {{{ self.bold_font = QVariant(self.bold_font) self.category_key = category_key self.temporary = temporary - self.tag = Tag(data) - self.tag.is_hierarchical = category_key.startswith('@') + self.tag = Tag(data, category=category_key, + is_editable=category_key not in ['news', 'search', 'identifiers'], + is_searchable=category_key not in ['news', 'search']) + elif self.type == self.TAG: self.icon_state_map[0] = QVariant(data.icon) self.tag = data @@ -660,14 +669,12 @@ class TagTreeItem(object): # {{{ ''' set_to: None => advance the state, otherwise a value from TAG_SEARCH_STATES ''' - basic_search_ok = self.tag.is_editable or \ - self.tag.category == 'formats' or self.tag.category == 'rating' if set_to is None: while True: self.tag.state = (self.tag.state + 1)%5 if self.tag.state == TAG_SEARCH_STATES['mark_plus'] or \ self.tag.state == TAG_SEARCH_STATES['mark_minus']: - if basic_search_ok: + if self.tag.is_searchable: break elif self.tag.state == TAG_SEARCH_STATES['mark_plusplus'] or\ self.tag.state == TAG_SEARCH_STATES['mark_minusminus']: @@ -766,6 +773,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.category_nodes.append(node) node.can_be_edited = (not is_gst) and (i == (len(path_parts)-1)) node.is_gst = is_gst + node.tag.is_hierarchical = not is_gst if not is_gst: tree_root[p] = {} tree_root = tree_root[p] @@ -1240,9 +1248,6 @@ class TagsModel(QAbstractItemModel): # {{{ n.id_set |= tag.id_set category_child_map[tag.name, tag.category] = n self.endInsertRows() - tag.is_editable = key != 'formats' and (key == 'news' or \ - self.db.field_metadata[tag.category]['datatype'] in \ - ['text', 'series', 'enumeration']) else: for i,comp in enumerate(components): if i == 0: @@ -1258,12 +1263,13 @@ class TagsModel(QAbstractItemModel): # {{{ if i < len(components)-1: t = copy.copy(tag) t.original_name = '.'.join(components[:i+1]) + # This 'manufactured' intermediate node can + # be searched, but cannot be edited. t.is_editable = False else: t = tag if not in_uc: t.original_name = t.name - t.is_editable = True t.is_hierarchical = True t.name = comp self.beginInsertRows(category_index, 999999, 1) @@ -1340,7 +1346,8 @@ class TagsModel(QAbstractItemModel): # {{{ for c in sorted(user_cats.keys(), key=sort_key): if icu_lower(c).startswith(ckey_lower): if len(c) == len(ckey): - if nkey_lower in user_cat_keys_lower: + if strcmp(ckey, nkey) != 0 and \ + nkey_lower in user_cat_keys_lower: error_dialog(self.tags_view, _('Rename user category'), _('The name %s is already used')%nkey, show=True) return False @@ -1348,7 +1355,8 @@ class TagsModel(QAbstractItemModel): # {{{ del user_cats[ckey] elif c[len(ckey)] == '.': rest = c[len(ckey):] - if icu_lower(nkey + rest) in user_cat_keys_lower: + if strcmp(ckey, nkey) != 0 and \ + icu_lower(nkey + rest) in user_cat_keys_lower: error_dialog(self.tags_view, _('Rename user category'), _('The name %s is already used')%(nkey+rest), show=True) return False diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index de0f83a5b2..964616ab48 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -17,17 +17,19 @@ from calibre.gui2.viewer.bookmarkmanager import BookmarkManager from calibre.gui2.widgets import ProgressIndicator from calibre.gui2.main_window import MainWindow from calibre.gui2 import Application, ORG_NAME, APP_UID, choose_files, \ - info_dialog, error_dialog, open_url, available_height, gprefs + info_dialog, error_dialog, open_url, available_height from calibre.ebooks.oeb.iterator import EbookIterator from calibre.ebooks import DRMError from calibre.constants import islinux, isfreebsd, isosx, filesystem_encoding -from calibre.utils.config import Config, StringConfig, dynamic +from calibre.utils.config import Config, StringConfig, JSONConfig from calibre.gui2.search_box import SearchBox2 from calibre.ebooks.metadata import MetaInformation from calibre.customize.ui import available_input_formats from calibre.gui2.viewer.dictionary import Lookup from calibre import as_unicode, force_unicode, isbytestring +vprefs = JSONConfig('viewer') + class TOCItem(QStandardItem): def __init__(self, toc): @@ -303,7 +305,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): m = self.open_history_menu m.clear() count = 0 - for path in gprefs.get('viewer_open_history', []): + for path in vprefs.get('viewer_open_history', []): if count > 9: break if os.path.exists(path): @@ -315,17 +317,17 @@ class EbookViewer(MainWindow, Ui_EbookViewer): return MainWindow.closeEvent(self, e) def save_state(self): - state = str(self.saveState(self.STATE_VERSION)) - dynamic['viewer_toolbar_state'] = state - dynamic.set('viewer_window_geometry', self.saveGeometry()) + state = bytearray(self.saveState(self.STATE_VERSION)) + vprefs['viewer_toolbar_state'] = state + vprefs.set('viewer_window_geometry', bytearray(self.saveGeometry())) if self.current_book_has_toc: - dynamic.set('viewer_toc_isvisible', bool(self.toc.isVisible())) + vprefs.set('viewer_toc_isvisible', bool(self.toc.isVisible())) if self.toc.isVisible(): - dynamic.set('viewer_splitter_state', + vprefs.set('viewer_splitter_state', bytearray(self.splitter.saveState())) def restore_state(self): - state = dynamic.get('viewer_toolbar_state', None) + state = vprefs.get('viewer_toolbar_state', None) if state is not None: try: state = QByteArray(state) @@ -676,13 +678,13 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.action_table_of_contents.setChecked(False) if isbytestring(pathtoebook): pathtoebook = force_unicode(pathtoebook, filesystem_encoding) - vh = gprefs.get('viewer_open_history', []) + vh = vprefs.get('viewer_open_history', []) try: vh.remove(pathtoebook) except: pass vh.insert(0, pathtoebook) - gprefs.set('viewer_open_history', vh[:50]) + vprefs.set('viewer_open_history', vh[:50]) self.build_recent_menu() self.action_table_of_contents.setDisabled(not self.iterator.toc) @@ -739,13 +741,13 @@ class EbookViewer(MainWindow, Ui_EbookViewer): c = config().parse() self.splitter.setSizes([1, 300]) if c.remember_window_size: - wg = dynamic.get('viewer_window_geometry', None) + wg = vprefs.get('viewer_window_geometry', None) if wg is not None: self.restoreGeometry(wg) - ss = dynamic.get('viewer_splitter_state', None) + ss = vprefs.get('viewer_splitter_state', None) if ss is not None: self.splitter.restoreState(ss) - self.show_toc_on_open = dynamic.get('viewer_toc_isvisible', False) + self.show_toc_on_open = vprefs.get('viewer_toc_isvisible', False) av = available_height() - 30 if self.height() > av: self.resize(self.width(), av) diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index aa9d6c8b9f..8ebf9c2c21 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal ' ''' Miscellaneous widgets used in the GUI ''' -import re, os, traceback +import re, traceback from PyQt4.Qt import QIcon, QFont, QLabel, QListWidget, QAction, \ QListWidgetItem, QTextCharFormat, QApplication, \ @@ -22,6 +22,8 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.meta import metadata_from_filename from calibre.utils.config import prefs, XMLConfig, tweaks from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndicator +from calibre.gui2.dnd import dnd_has_image, dnd_get_image, dnd_get_files, \ + IMAGE_EXTENSIONS, dnd_has_extension, DownloadDialog history = XMLConfig('history') @@ -141,36 +143,35 @@ class FilenamePattern(QWidget, Ui_Form): return pat -IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'gif', 'png', 'bmp'] - class FormatList(QListWidget): DROPABBLE_EXTENSIONS = BOOK_EXTENSIONS formats_dropped = pyqtSignal(object, object) delete_format = pyqtSignal() - @classmethod - def paths_from_event(cls, event): - ''' - Accept a drop event and return a list of paths that can be read from - and represent files with extensions. - ''' - if event.mimeData().hasFormat('text/uri-list'): - urls = [unicode(u.toLocalFile()) for u in event.mimeData().urls()] - urls = [u for u in urls if os.path.splitext(u)[1] and os.access(u, os.R_OK)] - return [u for u in urls if os.path.splitext(u)[1][1:].lower() in cls.DROPABBLE_EXTENSIONS] - def dragEnterEvent(self, event): - if int(event.possibleActions() & Qt.CopyAction) + \ - int(event.possibleActions() & Qt.MoveAction) == 0: - return - paths = self.paths_from_event(event) - if paths: + md = event.mimeData() + if dnd_has_extension(md, self.DROPABBLE_EXTENSIONS): event.acceptProposedAction() def dropEvent(self, event): - paths = self.paths_from_event(event) event.setDropAction(Qt.CopyAction) - self.formats_dropped.emit(event, paths) + md = event.mimeData() + # Now look for ebook files + urls, filenames = dnd_get_files(md, self.DROPABBLE_EXTENSIONS) + if not urls: + # Nothing found + return + + if not filenames: + # Local files + self.formats_dropped.emit(event, urls) + else: + # Remote files, use the first file + d = DownloadDialog(urls[0], filenames[0], self) + d.start_download() + if d.err is None: + self.formats_dropped.emit(event, [d.fpath]) + def dragMoveEvent(self, event): event.acceptProposedAction() @@ -183,7 +184,7 @@ class FormatList(QListWidget): class ImageDropMixin(object): # {{{ ''' - Adds support for dropping images onto widgets and a contect menu for + Adds support for dropping images onto widgets and a context menu for copy/pasting images. ''' DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS @@ -191,39 +192,36 @@ class ImageDropMixin(object): # {{{ def __init__(self): self.setAcceptDrops(True) - @classmethod - def paths_from_event(cls, event): - ''' - Accept a drop event and return a list of paths that can be read from - and represent files with extensions. - ''' - if event.mimeData().hasFormat('text/uri-list'): - urls = [unicode(u.toLocalFile()) for u in event.mimeData().urls()] - urls = [u for u in urls if os.path.splitext(u)[1] and os.access(u, os.R_OK)] - return [u for u in urls if os.path.splitext(u)[1][1:].lower() in cls.DROPABBLE_EXTENSIONS] - def dragEnterEvent(self, event): - if int(event.possibleActions() & Qt.CopyAction) + \ - int(event.possibleActions() & Qt.MoveAction) == 0: - return - paths = self.paths_from_event(event) - if paths: + md = event.mimeData() + if dnd_has_extension(md, self.DROPABBLE_EXTENSIONS) or \ + dnd_has_image(md): event.acceptProposedAction() def dropEvent(self, event): - paths = self.paths_from_event(event) event.setDropAction(Qt.CopyAction) - for path in paths: - pmap = QPixmap() - pmap.load(path) - if not pmap.isNull(): - self.handle_image_drop(path, pmap) - event.accept() - break + md = event.mimeData() - def handle_image_drop(self, path, pmap): + x, y = dnd_get_image(md) + if x is not None: + # We have an image, set cover + event.accept() + if y is None: + # Local image + self.handle_image_drop(x) + else: + # Remote files, use the first file + d = DownloadDialog(x, y, self) + d.start_download() + if d.err is None: + pmap = QPixmap() + pmap.loadFromData(open(d.fpath, 'rb').read()) + if not pmap.isNull(): + self.handle_image_drop(pmap) + + def handle_image_drop(self, pmap): self.set_pixmap(pmap) - self.cover_changed.emit(open(path, 'rb').read()) + self.cover_changed.emit(pixmap_to_data(pmap)) def dragMoveEvent(self, event): event.acceptProposedAction() diff --git a/src/calibre/library/add_to_library.py b/src/calibre/library/add_to_library.py index 8451241e3c..a453423a3c 100644 --- a/src/calibre/library/add_to_library.py +++ b/src/calibre/library/add_to_library.py @@ -8,7 +8,6 @@ __docformat__ = 'restructuredtext en' import os from hashlib import sha1 -from calibre.constants import filesystem_encoding from calibre.ebooks import BOOK_EXTENSIONS def find_folders_under(root, db, add_root=True, # {{{ @@ -17,21 +16,13 @@ def find_folders_under(root, db, add_root=True, # {{{ Find all folders under the specified root path, ignoring any folders under the library path of db - root must be a bytestring in filesystem_encoding - If follow_links is True, follow symbolic links. WARNING; this can lead to infinite recursion. cancel_callback must be a no argument callable that returns True to cancel the search ''' - assert not isinstance(root, unicode) # root must be in filesystem encoding lp = db.library_path - if isinstance(lp, unicode): - try: - lp = lp.encode(filesystem_encoding) - except: - lp = None if lp: lp = os.path.abspath(lp) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 823ef77bc5..97ddaeb51a 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -7,7 +7,7 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import re, itertools, time, traceback -from itertools import repeat +from itertools import repeat, izip, imap from datetime import timedelta from threading import Thread @@ -144,6 +144,22 @@ def _match(query, value, matchkind): pass return False +def force_to_bool(val): + if isinstance(val, (str, unicode)): + try: + val = icu_lower(val) + if not val: + val = None + elif val in [_('yes'), _('checked'), 'true']: + val = True + elif val in [_('no'), _('unchecked'), 'false']: + val = False + else: + val = bool(int(val)) + except: + val = None + return val + class CacheRow(list): # {{{ def __init__(self, db, composites, val): @@ -194,6 +210,7 @@ class ResultCache(SearchQueryParser): # {{{ self.first_sort = True self.search_restriction = '' self.search_restriction_book_count = 0 + self.marked_ids_dict = {} self.field_metadata = field_metadata self.all_search_locations = field_metadata.get_search_terms() SearchQueryParser.__init__(self, self.all_search_locations, optimize=True) @@ -531,37 +548,23 @@ class ResultCache(SearchQueryParser): # {{{ if item is None: continue - val = item[loc] - if isinstance(val, (str, unicode)): - try: - val = icu_lower(val) - if not val: - val = None - elif val in [_('yes'), _('checked'), 'true']: - val = True - elif val in [_('no'), _('unchecked'), 'false']: - val = False - else: - val = bool(int(val)) - except: - val = None - + val = force_to_bool(item[loc]) if not bools_are_tristate: if val is None or not val: # item is None or set to false - if query in [_('no'), _('unchecked'), 'false']: + if query in [_('no'), _('unchecked'), '_no', 'false']: matches.add(item[0]) else: # item is explicitly set to true - if query in [_('yes'), _('checked'), 'true']: + if query in [_('yes'), _('checked'), '_yes', 'true']: matches.add(item[0]) else: if val is None: - if query in [_('empty'), _('blank'), 'false']: + if query in [_('empty'), _('blank'), '_empty', 'false']: matches.add(item[0]) elif not val: # is not None and false - if query in [_('no'), _('unchecked'), 'true']: + if query in [_('no'), _('unchecked'), '_no', 'true']: matches.add(item[0]) else: # item is not None and true - if query in [_('yes'), _('checked'), 'true']: + if query in [_('yes'), _('checked'), '_yes', 'true']: matches.add(item[0]) return matches @@ -694,13 +697,14 @@ class ResultCache(SearchQueryParser): # {{{ if item is None: continue if not item[loc]: - if q == 'false': + if q == 'false' and matchkind == CONTAINS_MATCH: matches.add(item[0]) continue # item is empty. No possible matches below - if q == 'false': # Field has something in it, so a false query does not match + if q == 'false'and matchkind == CONTAINS_MATCH: + # Field has something in it, so a false query does not match continue - if q == 'true': + if q == 'true' and matchkind == CONTAINS_MATCH: if isinstance(item[loc], basestring): if item[loc].strip() == '': continue @@ -775,6 +779,36 @@ class ResultCache(SearchQueryParser): # {{{ def get_search_restriction_book_count(self): return self.search_restriction_book_count + def set_marked_ids(self, id_dict): + ''' + ids in id_dict are "marked". They can be searched for by + using the search term ``marked:true``. Pass in an empty dictionary or + set to clear marked ids. + + :param id_dict: Either a dictionary mapping ids to values or a set + of ids. In the latter case, the value is set to 'true' for all ids. If + a mapping is provided, then the search can be used to search for + particular values: ``marked:value`` + ''' + if not hasattr(id_dict, 'items'): + # Simple list. Make it a dict of string 'true' + self.marked_ids_dict = dict.fromkeys(id_dict, u'true') + else: + # Ensure that all the items in the dict are text + self.marked_ids_dict = dict(izip(id_dict.iterkeys(), imap(unicode, + id_dict.itervalues()))) + + # Set the values in the cache + marked_col = self.FIELD_MAP['marked'] + for r in self.iterall(): + r[marked_col] = None + + for id_, val in self.marked_ids_dict.iteritems(): + try: + self._data[id_][marked_col] = val + except: + pass + # }}} def remove(self, id): @@ -824,6 +858,7 @@ class ResultCache(SearchQueryParser): # {{{ self._data[id] = CacheRow(db, self.composites, db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0]) self._data[id].append(db.book_on_device_string(id)) + self._data[id].append(self.marked_ids_dict.get(id, None)) except IndexError: return None try: @@ -840,6 +875,7 @@ class ResultCache(SearchQueryParser): # {{{ self._data[id] = CacheRow(db, self.composites, db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0]) self._data[id].append(db.book_on_device_string(id)) + self._data[id].append(self.marked_ids_dict.get(id, None)) self._map[0:0] = ids self._map_filtered[0:0] = ids @@ -864,6 +900,15 @@ class ResultCache(SearchQueryParser): # {{{ for item in self._data: if item is not None: item.append(db.book_on_device_string(item[0])) + item.append(None) + + marked_col = self.FIELD_MAP['marked'] + for id_,val in self.marked_ids_dict.iteritems(): + try: + self._data[id_][marked_col] = val + except: + pass + self._map = [i[0] for i in self._data if i is not None] if field is not None: self.sort(field, ascending) @@ -947,18 +992,7 @@ class SortKeyGenerator(object): val = 0.0 dt = 'float' elif sb == 'bool': - try: - v = icu_lower(val) - if not val: - val = None - elif v in [_('yes'), _('checked'), 'true']: - val = True - elif v in [_('no'), _('unchecked'), 'false']: - val = False - else: - val = bool(int(val)) - except: - val = None + val = force_to_bool(val) dt = 'bool' if dt == 'datetime': diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 38b70fc2bf..d03975baea 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -47,13 +47,15 @@ copyfile = os.link if hasattr(os, 'link') else shutil.copyfile class Tag(object): def __init__(self, name, id=None, count=0, state=0, avg=0, sort=None, - tooltip=None, icon=None, category=None, id_set=None): + tooltip=None, icon=None, category=None, id_set=None, + is_editable = True, is_searchable=True): self.name = self.original_name = name self.id = id self.count = count self.state = state self.is_hierarchical = False - self.is_editable = True + self.is_editable = is_editable + self.is_searchable = is_searchable self.id_set = id_set self.avg_rating = avg/2.0 if avg is not None else 0 self.sort = sort @@ -145,6 +147,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def __init__(self, library_path, row_factory=False, default_prefs=None, read_only=False): + try: + if isbytestring(library_path): + library_path = library_path.decode(filesystem_encoding) + except: + traceback.print_exc() self.field_metadata = FieldMetadata() self._library_id_ = None # Create the lock to be used to guard access to the metadata writer @@ -158,8 +165,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.dbpath = os.path.join(library_path, 'metadata.db') self.dbpath = os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH', self.dbpath) - if isinstance(self.dbpath, unicode) and not iswindows: - self.dbpath = self.dbpath.encode(filesystem_encoding) if read_only and os.path.exists(self.dbpath): # Work on only a copy of metadata.db to ensure that @@ -372,6 +377,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.FIELD_MAP['ondevice'] = base = base+1 self.field_metadata.set_field_record_index('ondevice', base, prefer_custom=False) + self.FIELD_MAP['marked'] = base = base+1 + self.field_metadata.set_field_record_index('marked', base, prefer_custom=False) script = ''' DROP VIEW IF EXISTS meta2; @@ -419,6 +426,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.row = self.data.row self.has_id = self.data.has_id self.count = self.data.count + self.set_marked_ids = self.data.set_marked_ids for prop in ( 'author_sort', 'authors', 'comment', 'comments', @@ -484,12 +492,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): authors = self.authors(id, index_is_id=True) if not authors: authors = _('Unknown') - author = ascii_filename(authors.split(',')[0])[:self.PATH_LIMIT].decode(filesystem_encoding, 'replace') - title = ascii_filename(self.title(id, index_is_id=True))[:self.PATH_LIMIT].decode(filesystem_encoding, 'replace') + author = ascii_filename(authors.split(',')[0] + )[:self.PATH_LIMIT].decode('ascii', 'replace') + title = ascii_filename(self.title(id, index_is_id=True) + )[:self.PATH_LIMIT].decode('ascii', 'replace') while author[-1] in (' ', '.'): author = author[:-1] if not author: - author = ascii_filename(_('Unknown')).decode(filesystem_encoding, 'replace') + author = ascii_filename(_('Unknown')).decode( + 'ascii', 'replace') path = author + '/' + title + ' (%d)'%id return path @@ -500,8 +511,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): authors = self.authors(id, index_is_id=True) if not authors: authors = _('Unknown') - author = ascii_filename(authors.split(',')[0])[:self.PATH_LIMIT].decode(filesystem_encoding, 'replace') - title = ascii_filename(self.title(id, index_is_id=True))[:self.PATH_LIMIT].decode(filesystem_encoding, 'replace') + author = ascii_filename(authors.split(',')[0] + )[:self.PATH_LIMIT].decode('ascii', 'replace') + title = ascii_filename(self.title(id, index_is_id=True) + )[:self.PATH_LIMIT].decode('ascii', 'replace') name = title + ' - ' + author while name.endswith('.'): name = name[:-1] @@ -1439,10 +1452,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): reverse=True items.sort(key=kf, reverse=reverse) + is_editable = category not in ['news', 'rating'] categories[category] = [tag_class(formatter(r.n), count=r.c, id=r.id, avg=avgr(r), sort=r.s, icon=icon, tooltip=tooltip, category=category, - id_set=r.id_set) + id_set=r.id_set, is_editable=is_editable) for r in items] #print 'end phase "tags list":', time.clock() - last, 'seconds' @@ -1479,7 +1493,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): all=False) if count > 0: categories['formats'].append(Tag(fmt, count=count, icon=icon, - category='formats')) + category='formats', is_editable=False)) if sort == 'popularity': categories['formats'].sort(key=lambda x: x.count, reverse=True) @@ -1507,7 +1521,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): all=False) if count > 0: categories['identifiers'].append(Tag(ident, count=count, icon=icon, - category='identifiers')) + category='identifiers', + is_editable=False)) if sort == 'popularity': categories['identifiers'].sort(key=lambda x: x.count, reverse=True) @@ -1566,7 +1581,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): icon = icon_map['search'] for srch in saved_searches().names(): items.append(Tag(srch, tooltip=saved_searches().lookup(srch), - sort=srch, icon=icon, category='search')) + sort=srch, icon=icon, category='search', + is_editable=False)) if len(items): if icon_map is not None: icon_map['search'] = icon_map['search'] @@ -2546,6 +2562,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return ans + def get_all_identifier_types(self): + idents = self.conn.get('SELECT DISTINCT type FROM identifiers') + return [ident[0] for ident in idents] + def _clean_identifier(self, typ, val): typ = icu_lower(typ).strip().replace(':', '').replace(',', '') val = val.strip().replace(',', '|').replace(':', '|') diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index ff38af6890..b8180f9f39 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -273,6 +273,16 @@ class FieldMetadata(dict): 'is_custom':False, 'is_category':False, 'is_csp': False}), + ('marked', {'table':None, + 'column':None, + 'datatype':'text', + 'is_multiple':None, + 'kind':'field', + 'name': None, + 'search_terms':['marked'], + 'is_custom':False, + 'is_category':False, + 'is_csp': False}), ('series_index',{'table':None, 'column':None, 'datatype':'float', diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index de586048b7..96c42e6e0e 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -12,13 +12,13 @@ from calibre.constants import DEBUG from calibre.utils.config import Config, StringConfig, tweaks from calibre.utils.formatter import TemplateFormatter from calibre.utils.filenames import shorten_components_to, supports_long_names, \ - ascii_filename, sanitize_file_name + ascii_filename from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ebooks.metadata.meta import set_metadata -from calibre.constants import preferred_encoding, filesystem_encoding +from calibre.constants import preferred_encoding from calibre.ebooks.metadata import fmt_sidx from calibre.ebooks.metadata import title_sort -from calibre import strftime, prints +from calibre import strftime, prints, sanitize_file_name_unicode plugboard_any_device_value = 'any device' plugboard_any_format_value = 'any format' @@ -197,12 +197,10 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args[key] = '' components = SafeFormat().safe_format(template, format_args, 'G_C-EXCEPTION!', mi) - components = [x.strip() for x in components.split('/') if x.strip()] + components = [x.strip() for x in components.split('/')] components = [sanitize_func(x) for x in components if x] if not components: components = [str(id)] - components = [x.encode(filesystem_encoding, 'replace') if isinstance(x, - unicode) else x for x in components] if to_lowercase: components = [x.lower() for x in components] if replace_whitespace: @@ -247,7 +245,7 @@ def do_save_book_to_disk(id_, mi, cover, plugboards, return True, id_, mi.title components = get_components(opts.template, mi, id_, opts.timefmt, length, - ascii_filename if opts.asciiize else sanitize_file_name, + ascii_filename if opts.asciiize else sanitize_file_name_unicode, to_lowercase=opts.to_lowercase, replace_whitespace=opts.replace_whitespace) base_path = os.path.join(root, *components) @@ -329,8 +327,6 @@ def do_save_book_to_disk(id_, mi, cover, plugboards, def _sanitize_args(root, opts): if opts is None: opts = config().parse() - if isinstance(root, unicode): - root = root.encode(filesystem_encoding) root = os.path.abspath(root) opts.template = preprocess_template(opts.template) diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index fff18a7333..158bd81e50 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -12,7 +12,7 @@ for using |app| is to first add books to the library from your hard disk. to its internal database. Once they are in the database, you can perform a various :ref:`actions` on them that include conversion from one format to another, transfer to the reading device, viewing on your computer, editing metadata, including covers, etc. -Note that |app| creates copies of the files you add to it, your original files are left untouched. +Note that |app| creates copies of the files you add to it, your original files are left untouched. The interface is divided into various sections: @@ -51,10 +51,12 @@ Add books 3. **Add books directories, including sub-directories (Multiple books per directory, assumes every ebook file is a different book)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library. The algorithm assumes that each directory contains many books. All ebook files with the same name in a directory are assumed to be the same book in different formats. Ebooks with different names are added as different books. This action is the inverse of the :ref:`Save to disk ` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). - 4. **Add empty book. (Book Entry with blank formats)**: Allows you to create a blank book record. This can be used to then manually fill out the information about a book that you may not have yet in your collection. - - 5. **Add by ISBN**: Allows you to add one or more books by entering just their ISBN into a list or pasting the list of ISBNs from your clipboard. - + 4. **Add empty book. (Book Entry with blank formats)**: Allows you to create a blank book record. This can be used to then manually fill out the information about a book that you may not have yet in your collection. + + 5. **Add by ISBN**: Allows you to add one or more books by entering just their ISBN into a list or pasting the list of ISBNs from your clipboard. + + 6. **Add files to selected book records**: Allows you to add or update the files associated with an existing book in your library. + The :guilabel:`Add books` action can read metadata from a wide variety of e-book formats. In addition it tries to guess metadata from the filename. See the :ref:`config_filename_metadata` section, to learn how to configure this. @@ -77,7 +79,7 @@ Edit metadata 6. **Download only social metadata**: Downloads only social metadata such as tags and reviews (if available), for the books that are selected in the book list. 7. **Merge Book Records**: Gives you the capability of merging the metadata and formats of two or more book records together. You can choose to either delete or keep the records that were not clicked first. - + .. _convert_ebooks: Convert e-books @@ -91,13 +93,13 @@ Note that ebooks you purchase will typically have `Digital Rights Management Behavior. If a book has more than one format, you can view a particular format by clicking the down arrow on the right of the :guilabel:`View` button. - + .. _send_to_device: Send to device @@ -138,7 +140,7 @@ Send to device You can control the file name and folder structure of files sent to the device by setting up a template in :guilabel:`Preferences->Import/Export->Sending books to devices`. Also see :ref:`templatelangcalibre`. - + .. _fetch_news: Fetch news @@ -147,11 +149,11 @@ Fetch news :class: float-right-img |fni| The :guilabel:`Fetch news` action downloads news from various websites and converts it into an ebook that can be read on your ebook reader. Normally, the newly created ebook is added to your ebook library, but if an ebook reader is connected at the time the download finishes, the news is also uploaded to the reader automatically. - + The :guilabel:`Fetch news` action uses simple recipes (10-15 lines of code) for each news site. To learn how to create recipes for your own news sources, see :ref:`news`. The :guilabel:`Fetch news` action has three variations, accessed by clicking the down arrow on the right of the button. - + 1. **Schedule news download**: This action allows you to schedule the download of of your selected news sources from a list of hundreds of available. Scheduling can be set individually for each news source you select and the scheduling is flexible allowing you to select specific days of the week or a frequency of days between downloads. 2. **Add a custom news service**: This action allows you to create a simple recipe for downloading news from a custom news site that you wish to access. Creating the recipe can be as simple as specifying an RSS news feed URL, or you can be more prescriptive by creating python based code for the task, see :ref:`news`. 3. **Download all scheduled news sources**: This action causes |app| to immediately begin to download all news sources that you have previously scheduled. @@ -180,9 +182,9 @@ Device :class: float-right-img |dvi| The :guilabel:`Device` action allows you to view the books in the main memory or storage cards of your device, or to eject the device (detach it from |app|). -This icon shows up automatically on the main |app| toolbar when you connect a supported device. You can click on it to see the books on your device. You can also drag and drop books from your |app| library onto the icon to transfer them to your device. Conversely, you can drag and drop books from your device onto the |app| icon on the toolbar to transfer books from your device to the |app| library. +This icon shows up automatically on the main |app| toolbar when you connect a supported device. You can click on it to see the books on your device. You can also drag and drop books from your |app| library onto the icon to transfer them to your device. Conversely, you can drag and drop books from your device onto the |app| icon on the toolbar to transfer books from your device to the |app| library. + - .. _save_to_disk: Save to disk @@ -199,14 +201,14 @@ Save to disk Author_(sort) Title Book Files - + You can control the file name and folder structure of files saved to disk by setting up a template in :guilabel:`Preferences->Import/Export->Saving books to disk`. Also see :ref:`templatelangcalibre`. - + .. _save_to_disk_single: 2. **Save to disk in a single directory**: The selected books are saved to disk in a single directory. - + For 1. and 2. All available formats as well as metadata is stored to disk for each selected book. Metadata is stored in an OPF file. Saved books can be re-imported to the library without any loss of information by using the :ref:`Add books ` action. @@ -227,14 +229,14 @@ Connect/Share |csi| The :guilabel:`Connect/Share` action allows you to manually connect to a device or folder on your computer, it also allows you to set up you |app| library for access via a web browser, or email. The :guilabel:`Connect/Share` action has four variations, accessed by clicking the down arrow on the right of the button. - + 1. **Connect to folder**: This action allows you to connect to any folder on your computer as though it were a device and use all the facilities |app| has for devices with that folder. Useful if your device cannot be supported by |app| but is available as a USB disk. - - 2. **Connect to iTunes**: Allows you to connect to your iTunes books database as though it were a device. Once the books are sent to iTunes, you can then use iTunes to make them available on your various iDevices. Useful if you would rather not have |app| send books to your iDevice directly. - + + 2. **Connect to iTunes**: Allows you to connect to your iTunes books database as though it were a device. Once the books are sent to iTunes, you can then use iTunes to make them available on your various iDevices. Useful if you would rather not have |app| send books to your iDevice directly. + 3. **Start Content Server**: This action causes |app| to start up its built-in web server. When this is started, your |app| library will be accessible via a web browser from the internet (if you choose). You can configure how the web server is accessed by setting preferences at :guilabel:`Preferences->Sharing->Sharing over the net` - - 4. **Setup email based sharing of books**: This action allows you to setup |app| to share books (and news feeds) by email. After setting up email addresses for this option |app| will send news updates and book updates to the entered email addresses. You can configure how the |app| sends email by setting preferences at :guilabel:`Preferences->Sharing->Sharing books by email`. Once you have setup one or more email addresses, this menu entry get replaced by menu entries to send books to the setup email addresses. + + 4. **Setup email based sharing of books**: This action allows you to setup |app| to share books (and news feeds) by email. After setting up email addresses for this option |app| will send news updates and book updates to the entered email addresses. You can configure how the |app| sends email by setting preferences at :guilabel:`Preferences->Sharing->Sharing books by email`. Once you have setup one or more email addresses, this menu entry get replaced by menu entries to send books to the setup email addresses. .. _remove_books: @@ -245,14 +247,14 @@ Remove books |rbi| The :guilabel:`Remove books` action **deletes books permanently**, so use it with care. It is *context sensitive*, i.e. it depends on which :ref:`catalog ` you have selected. If you have selected the :guilabel:`Library`, books will be removed from the library. If you have selected the ebook reader device, the books will be removed from the device. To remove only a particular format for a given book use the :ref:`edit_meta_information` action. Remove books also has five variations which can be accessed by clicking the down arrow on the right side of the button. - 1. **Remove Selected Books**: Allows you to **permanently** remove all books that are selected in the book list. - + 1. **Remove Selected Books**: Allows you to **permanently** remove all books that are selected in the book list. + 2. **Remove files of a specified format from selected books..**: Allows you to **permanently** remove ebook files of a specified format, from books that are selected in the book list. - + 3. **Remove all files of a specified format, except..**: Allows you to **permanently** remove ebook files of a multiple formats except a given format, from books that are selected in the book list. - + 4. **Remove covers from selected books**: Allows you to **permanently** remove cover images files, from books that are selected in the book list. - + 5. **Remove matching books from device**: Allows you to remove ebook files from a connected device, that match the books that are selected in the book list. .. note:: @@ -265,7 +267,7 @@ Preferences .. |cbi| image:: images/preferences.png The Preferences Action allows you to change the way various aspects of |app| work. To access it, click the |cbi|. - + .. _catalogs: Catalogs @@ -274,9 +276,9 @@ Catalogs :align: center A *catalog* is a collection of books. |app| can manage two types of different catalogs: - + 1. **Library**: This is a collection of books stored in your |app| library on your computer - + 2. **Device**: This is a collection of books stored in the main memory of your ebook reader. It will be available when you connect the reader to your computer. - In addition, you can see the books on the storage card (if any) in your reader device. @@ -292,17 +294,17 @@ 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 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. - + * You can quickly and conveniently edit metadata by double-clicking the entry you want changed in the list. - + * You can perform :ref:`actions` on sets to books. To select multiple books you can either: - + - Keep the :kbd:`Ctrl` key pressed and click on the books you want selected. - + - Keep the :kbd:`Shift` key pressed and click on the starting and ending book of arange of books you want selected. - + * You can configure which fields you want displayed by using the :ref:`configuration` dialog. .. _search_interface: @@ -310,10 +312,10 @@ The Search & Sort section allows you to perform several powerful actions on your The Search Interface --------------------- You can search all the metadata by entering search terms in the search bar. Searches are case insensitive. For example:: - + Asimov Foundation format:lrf -This will match all books in your library that have ``Asimov`` and ``Foundation`` in their metadata and +This will match all books in your library that have ``Asimov`` and ``Foundation`` in their metadata and are available in the LRF format. Some more examples:: author:Asimov and not series:Foundation @@ -327,20 +329,18 @@ Equality searches are indicated by prefixing the search string with an equals si ``tag:"=science"`` will match "science", but not "science fiction" or "hard science". Regular expression searches are indicated by prefixing the search string with a tilde (~). Any python-compatible regular expression can be used. Regular expression searches are contains searches unless the expression contains anchors. -Should you need to search for a string with a leading equals or tilde, prefix the string with a backslash. +Should you need to search for a string with a leading equals or tilde, prefix the string with a backslash. Enclose search strings with quotes (") if the string contains parenthesis or spaces. For example, to search for the tag ``Science Fiction``, you would need to search for ``tag:"=science fiction"``. If you search for ``tag:=science fiction``, you will find all books with the tag 'science' and containing the word 'fiction' in any metadata. -You can build advanced search queries easily using the :guilabel:`Advanced Search Dialog`, accessed by +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, series_index, rating, cover, -comments, format, identifiers, 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. +comments, format, identifiers, date, pubdate, search, size`` and custom columns. If a device is plugged in, the ``ondevice`` field becomes available. To find the search name (actually called the `lookup name`) for a custom column, hover your mouse over the column header in the library view. The syntax for searching for dates is:: @@ -387,31 +387,31 @@ Searching for ``no`` or ``unchecked`` will find all books with ``No`` in the col Hierarchical items (e.g. A.B.C) use an extended syntax to match initial parts of the hierarchy. This is done by adding a period between the exact match indicator (=) and the text. For example, the query ``tags:=.A`` will find the tags `A` and `A.B`, but will not find the tags `AA` or `AA.B`. The query ``tags:=.A.B`` will find the tags `A.B` and `A.C`, but not the tag `A`. -Identifiers (e.g., isbn, doi, lccn etc) also use an extended syntax. First, note that an identifier has the form ``key:value``, as in ``isbn:123456789``. The extended syntax permits you to specify independently which key and value to search for. Both the key and the value parts of the query can use `equality`, `contains`, or `regular expression` matches. Examples: +Identifiers (e.g., isbn, doi, lccn etc) also use an extended syntax. First, note that an identifier has the form ``type:value``, as in ``isbn:123456789``. The extended syntax permits you to specify independently which type and value to search for. Both the type and the value parts of the query can use `equality`, `contains`, or `regular expression` matches. Examples: * ``identifiers:true`` will find books with any identifier. * ``identifiers:false`` will find books with no identifier. - * ``identifiers:123`` will search for books with any key having a value containing `123`. - * ``identifiers:=123456789`` will search for books with any key having a value equal to `123456789`. - * ``identifiers:=isbn:`` and ``identifiers:isbn:true`` will find books with a key equal to isbn having any value - * ``identifiers:=isbn:false`` will find books with no key equal to isbn. - * ``identifiers:=isbn:123`` will find books with a key equal to isbn having a value containing `123`. - * ``identifiers:=isbn:=123456789`` will find books with a key equal to isbn having a value equal to `123456789`. - * ``identifiers:i:1`` will find books with a key containing an `i` having a value containing a `1`. - + * ``identifiers:123`` will search for books with any type having a value containing `123`. + * ``identifiers:=123456789`` will search for books with any type having a value equal to `123456789`. + * ``identifiers:=isbn:`` and ``identifiers:isbn:true`` will find books with a type equal to isbn having any value + * ``identifiers:=isbn:false`` will find books with no type equal to isbn. + * ``identifiers:=isbn:123`` will find books with a type equal to isbn having a value containing `123`. + * ``identifiers:=isbn:=123456789`` will find books with a type equal to isbn having a value equal to `123456789`. + * ``identifiers:i:1`` will find books with a type containing an `i` having a value containing a `1`. + .. |sbi| image:: images/search_button.png :align: middle .. figure:: images/search.png :align: center - + :guilabel:`Advanced Search Dialog` Saving searches ----------------- -|app| has a useful feature, it allows you to save a search you use frequently under a special name and then re-use that search with a single click. To do this, create your search, either by typing it in the search bar, or using the Tag Browser. Then, type the name you would like to give to the search in the Saved Searches box next to the search bar and click the plus icon next to the saved searches box to save the search. +|app| has a useful feature, it allows you to save a search you use frequently under a special name and then re-use that search with a single click. To do this, create your search, either by typing it in the search bar, or using the Tag Browser. Then, type the name you would like to give to the search in the Saved Searches box next to the search bar and click the plus icon next to the saved searches box to save the search. Now, you can access your saved search in the Tag Browser under "Searches". A single click will allow you to re-use any arbitrarily complex search easily, without needing to re-create it. @@ -453,7 +453,7 @@ Tag Browser The Tag Browser allows you to easily browse your collection by Author/Tags/Series/etc. If you click on any item in the Tag Browser, for example the author name Isaac Asimov, then the list of books to the right is restricted to showing books by that author. You can click on category names as well. For example, clicking on "Series" will show you all books in any series. -The first click on an item will restrict the list of books to those that contain/match the item. Continuing the above example, clicking on Isaac Asimov will show books by that author. Clicking again on the item will change what is shown, depending on whether the item has children (see sub-categories and hierarchical items below). Continuing the Isaac Asimov example, clicking again on Isaac Asimov will restrict the list of books to those not by Isaac Asimov. A third click will remove the restriction, showing all books. If you hold down the Ctrl or Shift keys and click on multiple items, then restrictions based on multiple items are created. For example you could hold Ctrl and click on the tags History and Europe for find books on European history. The Tag Browser works by constructing search expressions that are automatically entered into the Search bar. Looking at what the Tag Browser generates is a good way to learn how to construct basic search expressions. +The first click on an item will restrict the list of books to those that contain/match the item. Continuing the above example, clicking on Isaac Asimov will show books by that author. Clicking again on the item will change what is shown, depending on whether the item has children (see sub-categories and hierarchical items below). Continuing the Isaac Asimov example, clicking again on Isaac Asimov will restrict the list of books to those not by Isaac Asimov. A third click will remove the restriction, showing all books. If you hold down the Ctrl or Shift keys and click on multiple items, then restrictions based on multiple items are created. For example you could hold Ctrl and click on the tags History and Europe for find books on European history. The Tag Browser works by constructing search expressions that are automatically entered into the Search bar. Looking at what the Tag Browser generates is a good way to learn how to construct basic search expressions. Items in the Tag browser have their icons partially colored. The amount of color depends on the average rating of the books in that category. So for example if the books by Isaac Asimov have an average of four stars, the icon for Isaac Asimov in the Tag Browser will be 4/5th colored. You can hover your mouse over the icon to see the average rating. @@ -461,13 +461,13 @@ The outer-level items in the tag browser such as Authors and Series are called c You can search user categories in the same way as built-in categories, by clicking on them. There are four different searches cycled through by clicking: "everything matching an item in the category" indicated by a single green plus sign, "everything matching an item in the category or its sub-categories" indicated by two green plus signs, "everything not matching an item in the category" shown by a single red minus sign, and "everything not matching an item in the category or its sub-categories" shown by two red minus signs. -It is also possible to create hierarchies inside some of the text categories such as tags, series, and custom columns. These hierarchies show with the small triangle, permitting the sub-items to be hidden. To use hierarchies of items in a category, you must first go to Preferences / Look & Feel and enter the category name(s) into the "Categories with hierarchical items" box. Once this is done, items in that category that contain periods will be shown using the small triangle. For example, assume you create a custom column called "Genre" and indicate that it contains hierarchical items. Once done, items such as Mystery.Thriller and Mystery.English will display as Mystery with the small triangle next to it. Clicking on the triangle will show Thriller and English as sub-items. +It is also possible to create hierarchies inside some of the text categories such as tags, series, and custom columns. These hierarchies show with the small triangle, permitting the sub-items to be hidden. To use hierarchies of items in a category, you must first go to Preferences / Look & Feel and enter the category name(s) into the "Categories with hierarchical items" box. Once this is done, items in that category that contain periods will be shown using the small triangle. For example, assume you create a custom column called "Genre" and indicate that it contains hierarchical items. Once done, items such as Mystery.Thriller and Mystery.English will display as Mystery with the small triangle next to it. Clicking on the triangle will show Thriller and English as sub-items. See :ref:`Managing subgroups of books, for example "genre" ` for more information. Hierarchical items (items with children) use the same four 'click-on' searches as user categories. Items that do not have children use two of the searches: "everything matching" and "everything not matching". You can drag and drop items in the Tag browser onto user categories to add them to that category. If the source is a user category, holding the shift key while dragging will move the item to the new category. You can also drag and drop books from the book list onto items in the Tag Browser; dropping a book on an item causes that item to be automatically applied to the dropped books. For example, dragging a book onto Isaac Asimov will set the author of that book to Isaac Asimov. Dropping it onto the tag History will add the tag History to the book's tags. -There is a search bar at the top of the Tag Browser that allows you to easily find any item in the Tag Browser. In addition, you can right click on any item and choose one of several operations. Some examples are to hide the it, rename it, or open a "Manage x" dialog that allows you to manage items of that kind. For example, the "Manage Authors" dialog allows you to rename authors and control how their names are sorted. +There is a search bar at the top of the Tag Browser that allows you to easily find any item in the Tag Browser. In addition, you can right click on any item and choose one of several operations. Some examples are to hide the it, rename it, or open a "Manage x" dialog that allows you to manage items of that kind. For example, the "Manage Authors" dialog allows you to rename authors and control how their names are sorted. You can control how items are sorted in the Tag browser via the box at the bottom of the Tag Browser. You can choose to sort by name, average rating or popularity (popularity is the number of books with an item in your library; for example; the popularity of Isaac Asimov is the number of book sin your library by Isaac Asimov). @@ -495,47 +495,47 @@ Calibre has several keyboard shortcuts to save you time and mouse movement. Thes - Action * - :kbd:`F2 (Enter in OS X)` - Edit the metadata of the currently selected field in the book list. - * - :kbd:`A` + * - :kbd:`A` - Add Books - * - :kbd:`Shift+A` + * - :kbd:`Shift+A` - Add Formats to the selected books - * - :kbd:`C` + * - :kbd:`C` - Convert selected Books - * - :kbd:`D` + * - :kbd:`D` - Send to device - * - :kbd:`Del` + * - :kbd:`Del` - Remove selected Books - * - :kbd:`E` + * - :kbd:`E` - Edit metadata of selected books - * - :kbd:`I` + * - :kbd:`I` - Show book details - * - :kbd:`M` + * - :kbd:`M` - Merge selected records - * - :kbd:`Alt+M` + * - :kbd:`Alt+M` - Merge selected records, keeping originals - * - :kbd:`O` + * - :kbd:`O` - Open containing folder - * - :kbd:`S` + * - :kbd:`S` - Save to Disk - * - :kbd:`V` + * - :kbd:`V` - View - * - :kbd:`Alt+V/Cmd+V in OS X` + * - :kbd:`Alt+V/Cmd+V in OS X` - View specific format - * - :kbd:`Alt+Shift+J` + * - :kbd:`Alt+Shift+J` - Toggle jobs list - * - :kbd:`Alt+Shift+B` + * - :kbd:`Alt+Shift+B` - Toggle Cover Browser - * - :kbd:`Alt+Shift+T` + * - :kbd:`Alt+Shift+T` - Toggle Tag Browser - * - :kbd:`Alt+A` + * - :kbd:`Alt+A` - Show books by the Same author as the current book - * - :kbd:`Alt+T` + * - :kbd:`Alt+T` - Show books with the same tags as current book - * - :kbd:`Alt+P` + * - :kbd:`Alt+P` - Show books by the same publisher as current book - * - :kbd:`Alt+Shift+S` + * - :kbd:`Alt+Shift+S` - Show books in the same series as current book - * - :kbd:`/, Ctrl+F` + * - :kbd:`/, Ctrl+F` - Focus the search bar * - :kbd:`Shift+Ctrl+F` - Open the advanced search dialog @@ -545,13 +545,13 @@ Calibre has several keyboard shortcuts to save you time and mouse movement. Thes - Find the next book that matches the current search (only works if the highlight checkbox next to the search bar is checked) * - :kbd:`Shift+N or Shift+F3` - Find the next book that matches the current search (only works if the highlight checkbox next to the search bar is checked) - * - :kbd:`Ctrl+D` + * - :kbd:`Ctrl+D` - Download metadata and shortcuts - * - :kbd:`Ctrl+R` + * - :kbd:`Ctrl+R` - Restart calibre * - :kbd:`Shift+Ctrl+E` - Add empty books to calibre - * - :kbd:`Ctrl+Q` + * - :kbd:`Ctrl+Q` - Quit calibre diff --git a/src/calibre/manual/images/sg_cc.jpg b/src/calibre/manual/images/sg_cc.jpg new file mode 100644 index 0000000000..c6be070ea5 Binary files /dev/null and b/src/calibre/manual/images/sg_cc.jpg differ diff --git a/src/calibre/manual/images/sg_genre.jpg b/src/calibre/manual/images/sg_genre.jpg new file mode 100644 index 0000000000..b9a4537772 Binary files /dev/null and b/src/calibre/manual/images/sg_genre.jpg differ diff --git a/src/calibre/manual/images/sg_pref.jpg b/src/calibre/manual/images/sg_pref.jpg new file mode 100644 index 0000000000..8bab672c25 Binary files /dev/null and b/src/calibre/manual/images/sg_pref.jpg differ diff --git a/src/calibre/manual/images/sg_restrict.jpg b/src/calibre/manual/images/sg_restrict.jpg new file mode 100644 index 0000000000..0400a27b30 Binary files /dev/null and b/src/calibre/manual/images/sg_restrict.jpg differ diff --git a/src/calibre/manual/images/sg_restrict2.jpg b/src/calibre/manual/images/sg_restrict2.jpg new file mode 100644 index 0000000000..1be7dea603 Binary files /dev/null and b/src/calibre/manual/images/sg_restrict2.jpg differ diff --git a/src/calibre/manual/images/sg_search.jpg b/src/calibre/manual/images/sg_search.jpg new file mode 100644 index 0000000000..fb23b129ad Binary files /dev/null and b/src/calibre/manual/images/sg_search.jpg differ diff --git a/src/calibre/manual/images/sg_tb.jpg b/src/calibre/manual/images/sg_tb.jpg new file mode 100644 index 0000000000..eeb5e73c97 Binary files /dev/null and b/src/calibre/manual/images/sg_tb.jpg differ diff --git a/src/calibre/manual/images/sg_tree.jpg b/src/calibre/manual/images/sg_tree.jpg new file mode 100644 index 0000000000..c116f2f46a Binary files /dev/null and b/src/calibre/manual/images/sg_tree.jpg differ diff --git a/src/calibre/manual/sub_groups.rst b/src/calibre/manual/sub_groups.rst new file mode 100644 index 0000000000..83b8f0cbe9 --- /dev/null +++ b/src/calibre/manual/sub_groups.rst @@ -0,0 +1,107 @@ + +.. include:: global.rst + +.. _subgroups-tutorial: + +Managing subgroups of books, for example "genre" +================================================== + +Some people wish to organize the books in their library into subgroups, similar to subfolders. The most commonly provided reason is to create genre hierarchies, but there are many others. One user asked for a way to organize textbooks by subject and course number. Another wanted to keep track of gifts by subject and recipient. This tutorial will use the genre example for the rest of this post. + +Before going on, please note that we are not talking about folders on the hard disk. Subgroups are not file folders. Books will not be copied anywhere. Calibre's library file structure is not affected. Instead, we are presenting a way to organize and display subgroups of books within a |app| library. + +.. contents:: + :depth: 1 + :local: + +.. |sgtree| image:: images/sg_tree.jpg + :class: float-right-img + + +The commonly-provided requirements for subgroups such as genres are: + + * A subgroup (e.g., a genre) must contain (point to) books, not categories of books. This is what distinguishes subgroups from |app| user categories. + * A book can be in multiple subgroups (genres). This distinguishes subgroups from physical file folders. + * Subgroups (genres) must form a hierarchy; subgroups can contain subgroups. + +Tags give you the first two. If you tag a book with the genre then you can use the tag browser (or search) for find the books with that genre, giving you the first. Many books can have the same tag(s), giving you the second. The problem is that tags don't satisfy the third requirement. They don't provide a hierarchy. + +|sgtree| Calibre's hierarchy feature gives you the third, the ability to see the genres in a 'tree' and the ability to easily search for books in genre or sub-genre. For example, assume that your genre structure is similar to the following:: + + Genre + . History + .. Japanese + .. Military + .. Roman + . Mysteries + .. English + .. Vampire + . Science Fiction + .. Alternate History + .. Military + .. Space Opera + . Thrillers + .. Crime + .. Horror + etc. + +By using the hierarchy feature, you can see these genres in the tag browser in tree form, as shown in the screen image. In this example the outermost level (Genre) is a custom column that contains the genres. Genres containing sub-genres appear with a small triangle next to them. Clicking on that triangle will open the item and show the sub-genres, as you can see with History and Science Fiction. + +Clicking on a genre can search for all books with that genre or children of that genre. For example, clicking on Science Fiction can give all three of the child genres, Alternate History, Military, and Space Opera. Clicking on Alternate History will give books in that genre, ignoring those in Military and Space Opera. Of course, a book can have multiple genres. If a book has both Space Opera and Military genres, then you will see that book if you click on either genre. Searching is discussed in more detail below. + +Another thing you can see from the image is that the genre Military appears twice, once under History and once under Science Fiction. Because the genres are in a hierarchy, these are two separate genres. A book can be in one, the other, or (doubtfully in this case) both. For example, the books in Winston Churchill's "The Second World War" could be in "History.Military". David Weber's Honor Harrington books could be in "Science Fiction.Military", and for that matter also in "Science Fiction.Space Opera." + +Once a genre exists, that is at least one book has that genre, you can easily apply it to other books by dragging the books from the library view onto the genre you want the books to have. You can also apply genres in the metadata editors; more on this below. + +Setup +---------------------------------------- + +By now, your question might be "How was all of this up?" There are three steps: 1) create the custom column, 2) tell |app| that the new column is to be treated as a hierarchy, and 3) add genres. + +You create the custom column in the usual way, using Preferences -> Add your own columns. This example uses "#genre" as the lookup name and "Genre" as the column heading. The column type is "Comma-separated text, like tags, shown in the tag browser." + +.. image:: images/sg_cc.jpg + :align: center + +Then after restarting |app|, you must tell |app| that the column is to be treated as a hierarchy. Go to Preferences -> Look and Feel and enter the lookup name "#genre" into the "Categories with hierarchical items" box. Press Apply, and you are done with setting up. + +.. image:: images/sg_pref.jpg + :align: center + +At the point there are no genres in the column. We are left with the last step: how to apply a genre to a book. A genre does not exist in |app| until it appears on at least one book. To learn how to apply a genre for the first time, we must go into some detail about what a genre looks like in the metadata for a book. + +A hierarchy of 'things' is built by creating an item consisting of phrases separated by periods. Continuing the genre example, these items would "History.Military", "Mysteries.Vampire", "Science Fiction.Space Opera", etc. Thus to create a new genre, you pick a book that should have that genre, edit its metadata, and enter the new genre into the column you created. Continuing our example, if you want to assign a new genre "Comics" with a sub-genre "Superheros" to a book, you would 'edit metadata' for that (comic) book, choose the Custom metadata tab, and then enter "Comics.Superheros" as shown in the following (ignore the other custom columns): + +.. image:: images/sg_genre.jpg + :align: center + +After doing the above, you see in the tag browser: + +.. image:: images/sg_tb.jpg + :align: center + +From here on, to apply this new genre to a book (a comic book, presumably), you can either drag the book onto the genre, or add it to the book using edit metadata in exactly the same way as done above. + +Searching +--------------- + +.. image:: images/sg_search.jpg + :align: center + +The easiest way to search for genres is using the tag browser, clicking on the genre you wish to see. Clicking on a genre with children will show you books with that genre and all child genres. However, this might bring up a question. Just because a genre has children doesn't mean that it isn't a genre in its own right. For example, a book can have the genre "History" but not "History.Military". How do you search for books with only "History"? + +The tag browser search mechanism knows if an item has children. If it does, clicking on the item cycles through 5 searches instead of the normal three. The first is the normal green plus, which shows you books with that genre only (e.g., History). The second is a doubled plus (shown above), which shows you books with that genre and all sub-genres (e.g., History and History.Military). The third is the normal red minus, which shows you books without that exact genre. The fourth is a doubled minus, which shows you books without that genre or sub-genres. The fifth is back to the beginning, no mark, meaning no search. + +Restrictions +--------------- + +If you search for a genre then create a saved search for it, you can use the 'restrict to' box to create a virtual library of books with that genre. This is useful if you want to do other searches within the genre or to manage/update metadata for books in the genre. Continuing our example, you can create a saved search named 'History.Japanese' by first clicking on the genre Japanese in the tag browser to get a search into the search box, entering History.Japanese into the saved search box, then pushing the "save search" button (the green box with the white plus, on the right-hand side). + +.. image:: images/sg_restrict.jpg + :align: center + +After creating the saved search, you can use it as a restriction. + +.. image:: images/sg_restrict2.jpg + :align: center + diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 3438f266b5..b686d78981 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -112,6 +112,8 @@ Functions are always applied before format specifications. See further down for The syntax for using functions is ``{field:function(arguments)}``, or ``{field:function(arguments)|prefix|suffix}``. Arguments are separated by commas. Commas inside arguments must be preceeded by a backslash ( '\\' ). The last (or only) argument cannot contain a closing parenthesis ( ')' ). Functions return the value of the field used in the template, suitably modified. +If you have programming experience, please note that the syntax in this mode (single function) is not what you might expect. Strings are not quoted. Spaces are significant. All arguments must be constants; there is no sub-evaluation. Use :ref:`template program mode ` and :ref:`general program mode ` to avoid these differences. + The functions available are: * ``lowercase()`` -- return value of the field in lower case. @@ -127,10 +129,25 @@ The functions available are: * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). * ``select(key)`` -- interpret the field as a comma-separated list of items, with the items being of the form "id:value". Find the pair with the id equal to key, and return the corresponding value. This function is particularly useful for extracting a value such as an isbn from the set of identifiers for a book. + * ``subitems(val, start_index, end_index)`` -- This function is used to break apart lists of tag-like hierarchical items such as genres. It interprets the value as a comma-separated list of tag-like items, where each item is a period-separated list. Returns a new list made by first finding all the period-separated tag-like items, then for each such item extracting the `start_index` th to the `end_index` th components, then combining the results back together. The first component in a period-separated list has an index of zero. If an index is negative, then it counts from the end of the list. As a special case, an end_index of zero is assumed to be the length of the list. Examples:: + + Assuming a #genre column containing "A.B.C": + {#genre:subitems(0,1)} returns "A" + {#genre:subitems(0,2)} returns "A.B" + {#genre:subitems(1,0)} returns "B.C" + Assuming a #genre column containing "A.B.C, D.E": + {#genre:subitems(0,1)} returns "A, D" + {#genre:subitems(0,2)} returns "A.B, D.E" + + * ``sublist(val, start_index, end_index, separator)`` -- interpret the value as a list of items separated by `separator`, returning a new list made from the `start_index` th to the `end_index` th item. The first item is number zero. If an index is negative, then it counts from the end of the list. As a special case, an end_index of zero is assumed to be the length of the list. Examples assuming that the tags column (which is comma-separated) contains "A, B ,C":: + + {tags:sublist(0,1,\,)} returns "A" + {tags:sublist(-1,0,\,)} returns "C" + {tags:sublist(0,-1,\,)} returns "A, B" + * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. - -Now, about using functions and formatting in the same field. Suppose you have an integer custom column called ``#myint`` that you want to see with leading zeros, as in ``003``. To do this, you would use a format of ``0>3s``. However, by default, if a number (integer or float) equals zero then the field produces the empty value, so zero values will produce nothing, not ``000``. If you really want to see ``000`` values, then you use both the format string and the ``ifempty`` function to change the empty value back to a zero. The field reference would be:: +Now, what about using functions and formatting in the same field. Suppose you have an integer custom column called ``#myint`` that you want to see with leading zeros, as in ``003``. To do this, you would use a format of ``0>3s``. However, by default, if a number (integer or float) equals zero then the field produces the empty value, so zero values will produce nothing, not ``000``. If you really want to see ``000`` values, then you use both the format string and the ``ifempty`` function to change the empty value back to a zero. The field reference would be:: {#myint:0>3s:ifempty(0)} @@ -138,6 +155,7 @@ Note that you can use the prefix and suffix as well. If you want the number to a {#myint:0>3s:ifempty(0)|[|]} +.. _template_mode: Using functions in templates - template program mode ---------------------------------------------------- @@ -238,6 +256,8 @@ The following functions are available in addition to those described in single-f * ``subtract(x, y)`` -- returns x - y. Throws an exception if either x or y are not numbers. * ``template(x)`` -- evaluates x as a template. The evaluation is done in its own context, meaning that variables are not shared between the caller and the template evaluation. Because the `{` and `}` characters are special, you must use `[[` for the `{` character and `]]` for the '}' character; they are converted automatically. For example, ``template('[[title_sort]]') will evaluate the template ``{title_sort}`` and return its value. +.. _general_mode: + Using general program mode ----------------------------------- diff --git a/src/calibre/manual/tutorials.rst b/src/calibre/manual/tutorials.rst index ecd40222d4..c156167cb1 100644 --- a/src/calibre/manual/tutorials.rst +++ b/src/calibre/manual/tutorials.rst @@ -12,6 +12,7 @@ Here you will find tutorials to get you started using |app|'s more advanced feat :maxdepth: 1 news + sub_groups xpath template_lang regexp diff --git a/src/calibre/startup.py b/src/calibre/startup.py index 41b20f3946..c883c43e8a 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -72,47 +72,6 @@ if not _run_once: pass ################################################################################ - # Improve builtin path functions to handle unicode sensibly - - _abspath = os.path.abspath - def my_abspath(path, encoding=sys.getfilesystemencoding()): - ''' - Work around for buggy os.path.abspath. This function accepts either byte strings, - in which it calls os.path.abspath, or unicode string, in which case it first converts - to byte strings using `encoding`, calls abspath and then decodes back to unicode. - ''' - to_unicode = False - if encoding is None: - encoding = preferred_encoding - if isinstance(path, unicode): - path = path.encode(encoding) - to_unicode = True - res = _abspath(path) - if to_unicode: - res = res.decode(encoding) - return res - - os.path.abspath = my_abspath - - _join = os.path.join - def my_join(a, *p): - encoding=sys.getfilesystemencoding() - if not encoding: - encoding = preferred_encoding - p = [a] + list(p) - _unicode = False - for i in p: - if isinstance(i, unicode): - _unicode = True - break - p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p] - - res = _join(*p) - if _unicode: - res = res.decode(encoding) - return res - - os.path.join = my_join def local_open(name, mode='r', bufsize=-1): ''' diff --git a/src/calibre/trac/bzr_commit_plugin.py b/src/calibre/trac/bzr_commit_plugin.py index 2f91804315..325bac7a79 100644 --- a/src/calibre/trac/bzr_commit_plugin.py +++ b/src/calibre/trac/bzr_commit_plugin.py @@ -19,7 +19,7 @@ in the working tree you want to use it with:: trac_reponame_password = ''' -import os, re, xmlrpclib +import os, re, xmlrpclib, subprocess from bzrlib.builtins import cmd_commit as _cmd_commit, tree_files from bzrlib import branch import bzrlib @@ -115,5 +115,7 @@ class cmd_commit(_cmd_commit): server.ticket.update(int(bug), msg, {'status':'closed', 'resolution':'fixed'}, True) + subprocess.Popen('/home/kovid/work/kde/mail.py -f --delay 10'.split()) + bzrlib.commands.register_command(cmd_commit) diff --git a/src/calibre/translations/af.po b/src/calibre/translations/af.po index 4518590395..4efc4c0e76 100644 --- a/src/calibre/translations/af.po +++ b/src/calibre/translations/af.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2009-11-06 19:11+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: Afrikaans \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:45+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:34+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -32,7 +32,7 @@ msgstr "Doen absolute niks" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -49,9 +49,9 @@ msgstr "Doen absolute niks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -61,8 +61,8 @@ msgstr "Doen absolute niks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,19 +74,19 @@ msgstr "Doen absolute niks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -118,7 +118,7 @@ msgstr "Doen absolute niks" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -127,36 +127,36 @@ msgstr "Doen absolute niks" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -791,22 +791,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "" @@ -854,20 +855,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "" @@ -875,8 +876,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "" @@ -886,8 +887,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "" @@ -895,13 +896,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "" @@ -990,7 +991,7 @@ msgstr "" msgid "Communicate with the BOOX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1022,7 +1023,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "" @@ -1109,7 +1110,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "" @@ -1338,21 +1339,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "" @@ -1389,11 +1390,11 @@ msgstr "" msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "" @@ -2497,103 +2498,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "" @@ -2947,8 +2950,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "" @@ -2998,74 +3001,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "" @@ -3086,7 +3089,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "" @@ -3646,139 +3650,165 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3786,12 +3816,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3804,7 +3834,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4021,7 +4051,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4052,21 +4082,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4087,7 +4117,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "" @@ -4212,14 +4242,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4232,23 +4262,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4458,7 +4488,7 @@ msgstr "" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4608,7 +4638,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "" @@ -4761,7 +4791,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "" @@ -4917,11 +4947,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -4956,32 +4986,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "" @@ -4994,16 +5026,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5083,7 +5125,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5445,7 +5487,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "" @@ -6775,181 +6817,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7223,7 +7265,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "" @@ -7393,9 +7435,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "" @@ -7422,44 +7466,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "" @@ -7601,22 +7656,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8458,21 +8513,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8550,177 +8605,212 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 @@ -8840,12 +8930,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "" @@ -8854,29 +8944,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -8989,12 +9079,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9171,6 +9261,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9419,34 +9513,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9534,7 +9628,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9543,7 +9637,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9611,12 +9705,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "" @@ -9624,34 +9718,68 @@ msgstr "" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -9987,7 +10115,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -9996,7 +10124,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10116,17 +10244,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10207,7 +10335,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10215,22 +10343,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10241,135 +10377,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10380,47 +10553,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11153,7 +11334,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "" @@ -11514,25 +11695,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11608,161 +11789,161 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11772,60 +11953,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11887,52 +12068,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12452,35 +12633,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12783,50 +12956,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13129,20 +13280,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13151,56 +13302,56 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13209,43 +13360,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13254,11 +13405,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13267,15 +13418,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13285,11 +13436,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13299,15 +13450,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13320,11 +13471,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13335,27 +13486,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13366,24 +13517,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13394,30 +13545,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13429,17 +13580,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13448,19 +13599,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13470,15 +13621,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13491,39 +13642,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13531,34 +13682,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13573,17 +13724,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13591,33 +13742,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13639,39 +13790,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13933,35 +14088,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14170,57 +14325,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14230,31 +14385,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14264,7 +14425,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14274,24 +14435,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14300,24 +14461,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14331,7 +14492,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14339,7 +14500,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14348,7 +14509,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14360,19 +14528,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index 1279996b50..ee045d78bd 100644 --- a/src/calibre/translations/ar.po +++ b/src/calibre/translations/ar.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2011-01-03 01:54+0000\n" "Last-Translator: Amr Hesham \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:45+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:35+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:121 @@ -29,7 +29,7 @@ msgstr "" msgid "The monospace family of fonts to embed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "" @@ -88,7 +88,7 @@ msgstr "لا يفعل شيءً" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -105,9 +105,9 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -117,8 +117,8 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -130,19 +130,19 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -174,7 +174,7 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -183,36 +183,36 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -866,22 +866,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "الأخبار" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "الفهرس" @@ -929,20 +930,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "يجري إحصاء قائمة كتب من الجهاز..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "يجري تحويل الكتب إلى الجهاز..." @@ -950,8 +951,8 @@ msgstr "يجري تحويل الكتب إلى الجهاز..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." @@ -961,8 +962,8 @@ msgstr "إضافة كتب لقائمة البيانات الوصفية للجه #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "يجري حذف الكتب من الجهاز..." @@ -970,13 +971,13 @@ msgstr "يجري حذف الكتب من الجهاز..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "يجري إرسال دليل المعلومات. إلى الجهاز..." @@ -1065,7 +1066,7 @@ msgstr "التواصل مع القارئ الكتاب الاليكترونى Han msgid "Communicate with the BOOX eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى BOOX ." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1097,7 +1098,7 @@ msgstr "التواصل مع القارئ الكتاب الاليكترونى IRe #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "John Schember" @@ -1184,7 +1185,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "غير مطبق" @@ -1415,21 +1416,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "لا يوجد بطاقات تخزين في القارئ ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "الفتحة المختارة : %s ليست مدعومة ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "لا توجد مساحة كافية في الذاكرة الرئيسية" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "لا توجد مساحة كافية في بطاقة التخزين" @@ -1466,11 +1467,11 @@ msgstr "" msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "الاتصال مع جهاز قارئ إلكتروني ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "يجري إحصاء معلومات الجهاز..." @@ -2592,103 +2593,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "المؤلف أو المؤلفون" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "الناشر" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "المنتج" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "التعليقات" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "الوسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "السلسلة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "اللغة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "ختم التوقيت" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "" @@ -3042,8 +3045,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "الغلاف" @@ -3093,74 +3096,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "صقحة العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "المحتويات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "الفهرس" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "المسرد" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "شكر وتقدير" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "ببليوغرافيا" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "حقوق المؤلف" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "الإهداء" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "قائمة الرسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "قائمة الجداول" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "الملاحظات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "النصّ الرئيسي" @@ -3181,7 +3184,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "" @@ -3741,139 +3745,165 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "إضافة كتب" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "A" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "إضافة كتب من دليل واحد" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "كتب EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "كتب HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "كتب LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "كتب MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "كتب نصّية" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "كتب PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "الرسومات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "أرشيفات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" +msgstr "إضافة كتب" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "إضافة كتب من دليل واحد" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3881,12 +3911,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3899,7 +3929,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4116,7 +4146,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4147,21 +4177,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4182,7 +4212,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "لا يمكن تحويله" @@ -4307,14 +4337,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4327,23 +4357,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4553,7 +4583,7 @@ msgstr "احصل على الأخبار" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4703,7 +4733,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "" @@ -4856,7 +4886,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "" @@ -5012,11 +5042,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -5051,32 +5081,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "المسار" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "التهيئات" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "" @@ -5089,16 +5121,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "بدون" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5178,7 +5220,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5540,7 +5582,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "عادي" @@ -6872,181 +6914,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "احصل على معلومات الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "احصل على قائمة الكتب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "ارسل الميتاداتا إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "رفع %d كتاب إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "حذف كتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "تنزيل الكتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "عرض كتاب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "خطأ" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "خطأ في الاتصال بالجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "الجهاز: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr " تم كشفه." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7320,7 +7362,7 @@ msgstr "إختيار التهيئة" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "التهيئة" @@ -7490,9 +7532,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "تاريخ" @@ -7519,44 +7563,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "ترتيب المؤلف" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "ISBN" @@ -7698,22 +7753,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8555,21 +8610,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "&اسم المستخدم:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "&كلمة السرّ" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8647,179 +8702,213 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" -msgstr "&بحث:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "أنشأه: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "آخر تنزيل: لم ينزّل من قبل" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "آخر تنزيل" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "جدولة تنزيل الأخبار" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" -msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" +msgstr "&بحث:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "ج&دولة للتنزيل:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "كل " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "اليوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "الأثنين" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "الثلاثاء" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "الأربعاء" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "الخميس" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "الجمعة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "السبت" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "الأحد" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "في" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " يوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "&حساب" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "&تنزيل الآن" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -"حذف الأخبار المنزّلة التي أقدم من العدد المخصص من الأيام. اضبطه بـ0 لتعطيله." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " -msgstr "حذف أخبار أقدم من " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 msgid "contains" @@ -8938,12 +9027,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "المؤلفون" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "الناشرون" @@ -8952,29 +9041,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -9091,12 +9180,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9273,6 +9362,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9521,34 +9614,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "متصل " -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9636,7 +9729,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9645,7 +9738,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9713,12 +9806,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "" @@ -9726,30 +9819,64 @@ msgstr "" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -10085,7 +10212,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -10094,7 +10221,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10214,17 +10341,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "مرتفع" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "منخفض" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10305,7 +10432,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10313,22 +10440,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10339,135 +10474,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10478,47 +10650,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11251,7 +11431,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "فشل في تشغيل خادم المحتوى" @@ -11612,25 +11792,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "بحث" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11706,161 +11886,161 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11870,60 +12050,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11985,52 +12165,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "خطأ في التحويل" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12510,35 +12690,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12841,50 +13013,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13187,20 +13337,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13209,7 +13359,7 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -13219,49 +13369,49 @@ msgstr "" "الحقول المتوفرة: %s\n" "الإفتراضي: %%default" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "ترتيب الترتيب بترتيب تصاعدي" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "السلسلة التي تستخدم لتفريق الحقول. الإفتراضي يستخدم الفراغ." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "الحقول غير صالحة. الحقول المتوفرة:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "حقل الترتيب غير صالح. الحقول المتوفرة:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13270,43 +13420,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13315,11 +13465,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "يجب أن تخصص على الأقل كتاباً واحداً للحذف" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13328,15 +13478,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13346,11 +13496,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13360,15 +13510,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13381,11 +13531,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13396,27 +13546,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13427,24 +13577,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13455,30 +13605,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13490,17 +13640,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13509,19 +13659,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13531,15 +13681,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13552,39 +13702,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13592,34 +13742,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13634,17 +13784,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13652,33 +13802,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13700,39 +13850,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13994,35 +14148,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14231,57 +14385,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14291,31 +14445,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14325,7 +14485,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14335,24 +14495,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14361,24 +14521,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14392,7 +14552,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14400,7 +14560,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14409,7 +14569,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14421,19 +14588,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" @@ -15457,6 +15639,15 @@ msgstr "" #~ msgid "Schedule for download" #~ msgstr "جدولة للتنزيل" +#~ msgid "Delete downloaded news older than " +#~ msgstr "حذف أخبار أقدم من " + +#~ msgid "" +#~ "Delete downloaded news older than the specified number of days. Set to zero " +#~ "to disable." +#~ msgstr "" +#~ "حذف الأخبار المنزّلة التي أقدم من العدد المخصص من الأيام. اضبطه بـ0 لتعطيله." + #~ msgid "" #~ "\n" #~ "Downloaded article %s from %s\n" diff --git a/src/calibre/translations/ast.po b/src/calibre/translations/ast.po index 832a6be57d..eb8881b664 100644 --- a/src/calibre/translations/ast.po +++ b/src/calibre/translations/ast.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2010-01-31 21:37+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:45+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:35+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -32,7 +32,7 @@ msgstr "" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -49,9 +49,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -61,8 +61,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,19 +74,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -118,7 +118,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -127,36 +127,36 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -791,22 +791,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "" @@ -854,20 +855,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "" @@ -875,8 +876,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "" @@ -886,8 +887,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "" @@ -895,13 +896,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "" @@ -990,7 +991,7 @@ msgstr "" msgid "Communicate with the BOOX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1022,7 +1023,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "" @@ -1109,7 +1110,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "" @@ -1338,21 +1339,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "" @@ -1389,11 +1390,11 @@ msgstr "" msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "" @@ -2497,103 +2498,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "" @@ -2947,8 +2950,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "" @@ -2998,74 +3001,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "" @@ -3086,7 +3089,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "" @@ -3646,139 +3650,165 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3786,12 +3816,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3804,7 +3834,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4021,7 +4051,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4052,21 +4082,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4087,7 +4117,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "" @@ -4212,14 +4242,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4232,23 +4262,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4458,7 +4488,7 @@ msgstr "" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4608,7 +4638,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "" @@ -4761,7 +4791,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "" @@ -4917,11 +4947,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -4956,32 +4986,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "" @@ -4994,16 +5026,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5083,7 +5125,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5445,7 +5487,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "" @@ -6775,181 +6817,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7223,7 +7265,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "" @@ -7393,9 +7435,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "" @@ -7422,44 +7466,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "" @@ -7601,22 +7656,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8458,21 +8513,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8550,177 +8605,212 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 @@ -8840,12 +8930,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "" @@ -8854,29 +8944,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -8989,12 +9079,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9171,6 +9261,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9419,34 +9513,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9534,7 +9628,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9543,7 +9637,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9611,12 +9705,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "" @@ -9624,34 +9718,68 @@ msgstr "" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -9987,7 +10115,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -9996,7 +10124,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10116,17 +10244,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10207,7 +10335,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10215,22 +10343,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10241,135 +10377,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10380,47 +10553,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11153,7 +11334,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "" @@ -11514,25 +11695,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11608,161 +11789,161 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11772,60 +11953,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11887,52 +12068,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12452,35 +12633,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12783,50 +12956,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13129,20 +13280,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13151,56 +13302,56 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13209,43 +13360,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13254,11 +13405,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13267,15 +13418,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13285,11 +13436,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13299,15 +13450,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13320,11 +13471,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13335,27 +13486,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13366,24 +13517,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13394,30 +13545,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13429,17 +13580,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13448,19 +13599,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13470,15 +13621,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13491,39 +13642,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13531,34 +13682,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13573,17 +13724,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13591,33 +13742,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13639,39 +13790,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13933,35 +14088,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14170,57 +14325,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14230,31 +14385,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14264,7 +14425,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14274,24 +14435,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14300,24 +14461,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14331,7 +14492,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14339,7 +14500,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14348,7 +14509,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14360,19 +14528,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" diff --git a/src/calibre/translations/bg.po b/src/calibre/translations/bg.po index ea10262e92..921e348f79 100644 --- a/src/calibre/translations/bg.po +++ b/src/calibre/translations/bg.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.51\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2011-01-29 00:02+0000\n" "Last-Translator: Rocky Stone \n" "Language-Team: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:46+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:36+0000\n" "X-Generator: Launchpad (build 12351)\n" "Generated-By: pygettext.py 1.5\n" @@ -32,7 +32,7 @@ msgstr "Не прави абсолютно нищо" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -49,9 +49,9 @@ msgstr "Не прави абсолютно нищо" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -61,8 +61,8 @@ msgstr "Не прави абсолютно нищо" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,19 +74,19 @@ msgstr "Не прави абсолютно нищо" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -118,7 +118,7 @@ msgstr "Не прави абсолютно нищо" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -127,36 +127,36 @@ msgstr "Не прави абсолютно нищо" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -809,22 +809,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "Новини" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "Каталог" @@ -872,20 +873,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "" @@ -893,8 +894,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "" @@ -904,8 +905,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "" @@ -913,13 +914,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "" @@ -1008,7 +1009,7 @@ msgstr "Комуникирай с Hanlin V5 eBook устройство" msgid "Communicate with the BOOX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1040,7 +1041,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "" @@ -1127,7 +1128,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "Не е изпълнено" @@ -1356,21 +1357,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "" @@ -1407,11 +1408,11 @@ msgstr "" msgid "Extra customization" msgstr "Допълнително персонализиране" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "" @@ -2515,103 +2516,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "Не" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "Да" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "Заглавие" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "Автор(и)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Издател" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Производител" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "Коментари" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "Етикети" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "Серии" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "Език" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "Публикувана" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "Права" @@ -2965,8 +2968,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "Корица" @@ -3016,74 +3019,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "Заглавна страница" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "Съдържание" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "Индекс" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "Речник" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "Благодарности" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "Библиография" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "Послеслов" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "Авторски права" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "Посвещение" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "Епиграф" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "Предисловие" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "Списък на Илюстрации" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "Бележки" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "Предговор" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "Основен текст" @@ -3104,7 +3107,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "Рейтинг" @@ -3664,139 +3668,165 @@ msgstr "" msgid "Choose Files" msgstr "Избор на файлове" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "Добавяне на книги" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "Добавяне от ISBN номер" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "Книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "EPUB книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "LRF книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "HTML книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "LIT книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "MOBI книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "Topaz книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "Text книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "PDF книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "Комикси" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "Архиви" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" -msgstr "Поддържани книги" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" +msgstr "Добавяне на книги" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "Добавяне от ISBN номер" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "Поддържани книги" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "Добавяне към библиотеката" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3804,12 +3834,12 @@ msgstr "Добавяне към библиотеката" msgid "No book selected" msgstr "Не е избрана книга" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3822,7 +3852,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4039,7 +4069,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4070,21 +4100,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "Не е позволено" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4105,7 +4135,7 @@ msgid "Bulk convert" msgstr "Масово конвертиране" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "Не може да се конвертира" @@ -4230,14 +4260,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4250,23 +4280,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4476,7 +4506,7 @@ msgstr "" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4626,7 +4656,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "Показване на детайлите на книгата" @@ -4779,7 +4809,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "Няма книги" @@ -4935,11 +4965,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -4974,32 +5004,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "Път" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "Формати" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "Колекции" @@ -5012,16 +5044,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5101,7 +5143,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5463,7 +5505,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "" @@ -6793,181 +6835,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Грешка" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "Няма подходящи формати" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "Устройство: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "Няма устройство" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "Няма карта" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "Няма място на устройството" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7241,7 +7283,7 @@ msgstr "Избор на формат" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "Формат" @@ -7411,9 +7453,11 @@ msgstr "Местоположение" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "Дата" @@ -7440,44 +7484,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "ISBN" @@ -7619,22 +7674,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "Малки букви" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "Главни букви" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8479,21 +8534,21 @@ msgid "Password needed" msgstr "Необходима е парола" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "&Потребителско име:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "П&арола:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8571,177 +8626,212 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" -msgstr "&Търсене:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "преди %d дни, %d часа и %d минути" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "Последно свалено" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "График за сваляне на новини" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "Няма интернет връзка" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" -msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" +msgstr "&Търсене:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "Всеки " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "ден" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "Понеделник" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "Вторник" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "Сряда" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "Четвъртък" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "Петък" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "Събота" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "Неделя" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "в" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " дни" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "Д&опълнителни" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 @@ -8861,12 +8951,12 @@ msgid "Choose formats" msgstr "Избор на формати" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "Автори" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "Издатели" @@ -8875,29 +8965,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -9010,12 +9100,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9192,6 +9282,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9440,34 +9534,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9555,7 +9649,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9564,7 +9658,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9632,12 +9726,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "Размер (MB)" @@ -9645,34 +9739,68 @@ msgstr "Размер (MB)" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "Книга %s от %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -10008,7 +10136,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -10017,7 +10145,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10137,17 +10265,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10228,7 +10356,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10236,22 +10364,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10262,135 +10398,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10401,47 +10574,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11176,7 +11357,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "" @@ -11539,25 +11720,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "Търсене" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11633,161 +11814,161 @@ msgstr "Щракнете, за да промените" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11797,60 +11978,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11912,52 +12093,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12477,35 +12658,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12808,50 +12981,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13154,20 +13305,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13176,56 +13327,56 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13234,43 +13385,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13279,11 +13430,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13292,15 +13443,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13310,11 +13461,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13324,15 +13475,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13345,11 +13496,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13360,27 +13511,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13391,24 +13542,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13419,30 +13570,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13454,17 +13605,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13473,19 +13624,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13495,15 +13646,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13516,39 +13667,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13556,34 +13707,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13598,17 +13749,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13616,33 +13767,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13664,39 +13815,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13958,35 +14113,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14195,57 +14350,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14255,31 +14410,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14289,7 +14450,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14299,24 +14460,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14325,24 +14486,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14356,7 +14517,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14364,7 +14525,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14373,7 +14534,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14385,19 +14553,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" diff --git a/src/calibre/translations/bn.po b/src/calibre/translations/bn.po index f1981ed3b5..223fa51760 100644 --- a/src/calibre/translations/bn.po +++ b/src/calibre/translations/bn.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2010-12-11 02:29+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: Bengali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:46+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:36+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -32,7 +32,7 @@ msgstr "আসলে কিছুই করে না" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -49,9 +49,9 @@ msgstr "আসলে কিছুই করে না" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -61,8 +61,8 @@ msgstr "আসলে কিছুই করে না" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,19 +74,19 @@ msgstr "আসলে কিছুই করে না" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -118,7 +118,7 @@ msgstr "আসলে কিছুই করে না" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -127,36 +127,36 @@ msgstr "আসলে কিছুই করে না" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -786,22 +786,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "" @@ -849,20 +850,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "" @@ -870,8 +871,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "" @@ -881,8 +882,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "" @@ -890,13 +891,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "" @@ -985,7 +986,7 @@ msgstr "" msgid "Communicate with the BOOX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1017,7 +1018,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "" @@ -1104,7 +1105,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "" @@ -1333,21 +1334,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "" @@ -1384,11 +1385,11 @@ msgstr "" msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "" @@ -2492,103 +2493,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "" @@ -2942,8 +2945,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "" @@ -2993,74 +2996,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "" @@ -3081,7 +3084,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "" @@ -3641,139 +3645,165 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3781,12 +3811,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3799,7 +3829,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4016,7 +4046,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4047,21 +4077,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4082,7 +4112,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "" @@ -4207,14 +4237,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4227,23 +4257,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4453,7 +4483,7 @@ msgstr "" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4603,7 +4633,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "" @@ -4756,7 +4786,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "" @@ -4912,11 +4942,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -4951,32 +4981,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "" @@ -4989,16 +5021,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5078,7 +5120,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5440,7 +5482,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "" @@ -6770,181 +6812,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7218,7 +7260,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "" @@ -7388,9 +7430,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "" @@ -7417,44 +7461,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "" @@ -7596,22 +7651,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8453,21 +8508,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8545,177 +8600,212 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 @@ -8835,12 +8925,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "" @@ -8849,29 +8939,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -8984,12 +9074,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9166,6 +9256,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9414,34 +9508,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9529,7 +9623,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9538,7 +9632,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9606,12 +9700,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "" @@ -9619,34 +9713,68 @@ msgstr "" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -9982,7 +10110,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -9991,7 +10119,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10111,17 +10239,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10202,7 +10330,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10210,22 +10338,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10236,135 +10372,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10375,47 +10548,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11148,7 +11329,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "" @@ -11509,25 +11690,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11603,161 +11784,161 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11767,60 +11948,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11882,52 +12063,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12447,35 +12628,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12778,50 +12951,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13124,20 +13275,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13146,56 +13297,56 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13204,43 +13355,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13249,11 +13400,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13262,15 +13413,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13280,11 +13431,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13294,15 +13445,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13315,11 +13466,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13330,27 +13481,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13361,24 +13512,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13389,30 +13540,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13424,17 +13575,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13443,19 +13594,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13465,15 +13616,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13486,39 +13637,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13526,34 +13677,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13568,17 +13719,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13586,33 +13737,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13634,39 +13785,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13928,35 +14083,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14165,57 +14320,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14225,31 +14380,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14259,7 +14420,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14269,24 +14430,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14295,24 +14456,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14326,7 +14487,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14334,7 +14495,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14343,7 +14504,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14355,19 +14523,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" diff --git a/src/calibre/translations/bs.po b/src/calibre/translations/bs.po index 76229929db..78270dcc71 100644 --- a/src/calibre/translations/bs.po +++ b/src/calibre/translations/bs.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" "PO-Revision-Date: 2011-01-18 21:03+0000\n" "Last-Translator: Senad Sopovic \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-26 04:46+0000\n" +"X-Launchpad-Export-Date: 2011-03-05 04:36+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -32,7 +32,7 @@ msgstr "Radi apsolutno ništa" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -49,9 +49,9 @@ msgstr "Radi apsolutno ništa" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -61,8 +61,8 @@ msgstr "Radi apsolutno ništa" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,19 +74,19 @@ msgstr "Radi apsolutno ništa" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -118,7 +118,7 @@ msgstr "Radi apsolutno ništa" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -127,36 +127,36 @@ msgstr "Radi apsolutno ništa" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -786,22 +786,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "Vijesti" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "Katalog" @@ -849,20 +850,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "" @@ -870,8 +871,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "" @@ -881,8 +882,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "Uklanjam knjige sa uređaja..." @@ -890,13 +891,13 @@ msgstr "Uklanjam knjige sa uređaja..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "" @@ -985,7 +986,7 @@ msgstr "" msgid "Communicate with the BOOX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1017,7 +1018,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "" @@ -1104,7 +1105,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "" @@ -1333,21 +1334,21 @@ msgid "" "system errors." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "" @@ -1384,11 +1385,11 @@ msgstr "" msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "" @@ -2492,103 +2493,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "" @@ -2942,8 +2945,8 @@ msgstr "" msgid "Cover saved to file " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "" @@ -2993,74 +2996,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "" @@ -3081,7 +3084,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "" @@ -3641,139 +3645,165 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 -msgid "Add books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books to the calibre library/device from files on your computer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 -msgid "A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 -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:43 -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:47 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 -msgid "Shift+Ctrl+E" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 -msgid "Add from ISBN" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 -msgid "Adding" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 -msgid "Creating book records from ISBNs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 -msgid "Supported books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 +msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 -msgid "Merged some books" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 +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:60 +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:64 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 +msgid "Shift+Ctrl+E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 +msgid "Add from ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +msgid "Adding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +msgid "Creating book records from ISBNs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +msgid "Uploading books to device." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " "settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3781,12 +3811,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 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:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "" @@ -3799,7 +3829,7 @@ 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:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "" @@ -4016,7 +4046,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4047,21 +4077,21 @@ msgid "" "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -4082,7 +4112,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "" @@ -4207,14 +4237,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "" @@ -4227,23 +4257,23 @@ msgid "None of the selected books are on the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -4453,7 +4483,7 @@ msgstr "" msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr "" @@ -4603,7 +4633,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "" @@ -4756,7 +4786,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "" @@ -4912,11 +4942,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -4951,32 +4981,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "" @@ -4989,16 +5021,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "" @@ -5078,7 +5120,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -5440,7 +5482,7 @@ msgid "Style the selected text block" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "" @@ -6770,181 +6812,181 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -7218,7 +7260,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "" @@ -7388,9 +7430,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "" @@ -7417,44 +7461,55 @@ msgstr "" msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "" @@ -7596,22 +7651,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "" @@ -8453,21 +8508,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8545,177 +8600,212 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 @@ -8835,12 +8925,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "" @@ -8849,29 +8939,29 @@ msgid " (not on any book)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" @@ -8984,12 +9074,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -9166,6 +9256,10 @@ msgstr "" msgid "Choose a recipe file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -9414,34 +9508,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "" @@ -9529,7 +9623,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "" @@ -9538,7 +9632,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "" @@ -9606,12 +9700,12 @@ msgid "Edit template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "" @@ -9619,34 +9713,68 @@ msgstr "" msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "" @@ -9982,7 +10110,7 @@ msgid "%s %s for: %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "" @@ -9991,7 +10119,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "" @@ -10111,17 +10239,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "" @@ -10202,7 +10330,7 @@ msgstr "" msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -10210,22 +10338,30 @@ msgid "" "own, custom columns." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "" @@ -10236,135 +10372,172 @@ msgid "" "section are restored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -10375,47 +10548,55 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 -msgid "Field template. Uses the same syntax as save templates." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 -msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 -msgid "Default: (nothing)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 msgid "&Template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 +msgid "Field template. Uses the same syntax as save templates." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 +msgid "Similar to save templates. For example, {title} {isbn}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 +msgid "Default: (nothing)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "" @@ -11148,7 +11329,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "" @@ -11509,25 +11690,25 @@ msgid "Apply any changes you made to this tweak" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:431 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:433 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -11603,161 +11784,161 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:363 msgid "Rename %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:320 msgid "Edit sort for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:324 msgid "Add %s to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 msgid "Children of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:344 msgid "Remove %s from category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 msgid "Search for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:355 msgid "Search for everything but %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:367 msgid "Add sub-category to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:371 msgid "Delete user category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:381 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 msgid "Search for books in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:394 msgid "Search for books not in category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:406 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:409 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:421 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:428 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:431 msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:743 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1012 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1054 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1281 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1297 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1305 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1352 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1282 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1306 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1353 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1329 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1376 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1330 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1377 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1715 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1777 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1766 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1828 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1831 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1767 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1829 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1832 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1791 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1853 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1854 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1811 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1873 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1812 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1874 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1935 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1938 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2000 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -11767,60 +11948,60 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1947 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2009 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2013 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2014 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1959 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2021 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2042 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -11882,52 +12063,52 @@ msgstr "" msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " "automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 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:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -12447,35 +12628,27 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "" @@ -12778,50 +12951,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "" @@ -13124,20 +13275,20 @@ msgstr "" msgid "Folders raising exception" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -13146,56 +13297,56 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -13204,43 +13355,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -13249,11 +13400,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -13262,15 +13413,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -13280,11 +13431,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -13294,15 +13445,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -13315,11 +13466,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -13330,27 +13481,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -13361,24 +13512,24 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -13389,30 +13540,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -13424,17 +13575,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -13443,19 +13594,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -13465,15 +13616,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -13486,39 +13637,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -13526,34 +13677,34 @@ msgid "" "{0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -13568,17 +13719,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -13586,33 +13737,33 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -13634,39 +13785,43 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "" @@ -13928,35 +14083,35 @@ msgstr "" msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "" @@ -14165,57 +14320,57 @@ msgstr "" msgid "No such variable " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -14225,31 +14380,37 @@ msgid "" "template {title_sort} and return its value." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " "template processor to construct complex results from local variables." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " "to a black hole." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -14259,7 +14420,7 @@ msgid "" "'234'." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -14269,24 +14430,24 @@ msgid "" "constructing variable save paths" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " "match` if matches are found, otherwise it returns `text if no match`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -14295,24 +14456,24 @@ msgid "" "want" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " "in all of calibre, these are python-compatible regular expressions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -14326,7 +14487,7 @@ msgid "" "example, the title `The Dome` would not be changed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -14334,7 +14495,7 @@ msgid "" "{tags:count(,)}, {authors:count(&)}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -14343,7 +14504,14 @@ msgid "" "separator has the same meaning as in the count function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -14355,19 +14523,34 @@ msgid "" "A
    {#genre:sublist(0,-1,.)} returns A.B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 524afbdd4f..3ee4d6823b 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-02-25 19:16+0000\n" -"PO-Revision-Date: 2011-02-25 23:06+0000\n" +"POT-Creation-Date: 2011-03-04 20:51+0000\n" +"PO-Revision-Date: 2011-03-06 21:39+0000\n" "Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-02-27 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-03-07 04:47+0000\n" "X-Generator: Launchpad (build 12351)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -35,7 +35,7 @@ msgstr "No fa res" #: /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:660 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -52,9 +52,9 @@ msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:74 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:380 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:419 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:54 @@ -64,8 +64,8 @@ msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1036 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1146 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1054 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1164 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -77,19 +77,19 @@ msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:158 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:665 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:880 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:43 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:82 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:667 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:882 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -121,7 +121,7 @@ msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 @@ -130,36 +130,36 @@ msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:972 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:452 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:458 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:468 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1609 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2618 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2749 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:502 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -856,22 +856,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:908 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:914 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:944 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:259 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:272 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2480 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:909 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "Notícies" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2442 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 msgid "Catalog" msgstr "Catàleg" @@ -927,20 +928,20 @@ msgstr "Bambook" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:147 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:123 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 msgid "Getting list of books on device..." msgstr "S'està aconseguint la llista de llibres del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:264 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:268 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:279 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:201 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 msgid "Transferring books to device..." msgstr "S'està transferint llibres al dispositiu..." @@ -948,8 +949,8 @@ msgstr "S'està transferint llibres al dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:382 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:254 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:304 msgid "Adding books to device metadata listing..." msgstr "S'està afegint llibres al llistat de metadades del dispositiu..." @@ -959,8 +960,8 @@ msgstr "S'està afegint llibres al llistat de metadades del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:299 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:331 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:260 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:328 msgid "Removing books from device..." msgstr "S'estan suprimint els llibres del dispositiu..." @@ -968,13 +969,13 @@ msgstr "S'estan suprimint els llibres del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:335 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:342 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:285 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:335 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:340 msgid "Removing books from device metadata listing..." msgstr "S'està suprimint llibres del llistat de metadades del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:397 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:320 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:370 msgid "Sending metadata to device..." msgstr "S'està enviant metadades al dispositiu..." @@ -1063,7 +1064,7 @@ msgstr "Comunica't amb un lector Hanlin V5." msgid "Communicate with the BOOX eBook reader." msgstr "Comunica't amb un lector BOOX." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:133 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used." @@ -1097,7 +1098,7 @@ msgstr "Comunica't amb un lector IRex Iliad" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:43 msgid "John Schember" msgstr "John Schember" @@ -1195,7 +1196,7 @@ msgstr "" "«Im_Reading». Creeu una etiqueta amb el nom «Im_Reading» " #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 msgid "Not Implemented" msgstr "No implementat" @@ -1453,21 +1454,21 @@ msgstr "" "La memòria principal de %s és només de lectura. Sol passar per errors al " "sistema de fitxers." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 msgid "The reader has no storage card in this slot." msgstr "El lector no té cap targeta de memòria en aquesta ranura." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:845 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:846 msgid "Selected slot: %s is not supported." msgstr "La ranura seleccionada: %s no és compatible." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:874 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:875 msgid "There is insufficient free space in main memory" msgstr "No hi ha espai lliure suficient a la memòria principal" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:876 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:878 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:877 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:879 msgid "There is insufficient free space on the storage card" msgstr "No hi ha espai lliure suficient a la targeta de memòria" @@ -1504,11 +1505,11 @@ msgstr "Plantilla per controlar com es desen els llibres" msgid "Extra customization" msgstr "Personalització addicional" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:42 msgid "Communicate with an eBook reader." msgstr "Comunica't amb un lector de llibres electrònics." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:92 msgid "Get device information..." msgstr "Obté informació del dispositiu..." @@ -2924,103 +2925,105 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "ERROR A LA PLANTILLA" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "No" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "Sí" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:658 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "Tí­tol" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 msgid "Author(s)" msgstr "Autor(s)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:660 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Editorial" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:661 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Productor" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "Comentaris" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1180 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 msgid "Tags" msgstr "Etiquetes" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" msgstr "Sèries" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:625 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:667 msgid "Language" msgstr "Llengua" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1172 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 msgid "Timestamp" msgstr "Marca de temps" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:671 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:271 msgid "Published" msgstr "Publicat" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:673 msgid "Rights" msgstr "Drets" @@ -3438,8 +3441,8 @@ msgstr "S'ha trobat una portada per al llibre" msgid "Cover saved to file " msgstr "S'ha desat la portada al fitxer " -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1328 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1448 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 msgid "Cover" msgstr "Portada" @@ -3496,74 +3499,74 @@ msgstr "" msgid "All articles" msgstr "Tots els articles" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:269 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:270 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Aquest és un llibre Amazon Topaz. No es pot processar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1449 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 msgid "Title Page" msgstr "Pàgina del títol" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1450 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1451 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 msgid "Index" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1452 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 msgid "Glossary" msgstr "Glossari" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1453 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 msgid "Acknowledgements" msgstr "Agraïments" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1454 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1455 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 msgid "Colophon" msgstr "Colofó" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1456 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 msgid "Copyright" msgstr "Drets d'autor" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1457 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 msgid "Dedication" msgstr "Dedicatòria" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1458 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 msgid "Epigraph" msgstr "Epígraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1459 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 msgid "Foreword" msgstr "Prefaci" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1460 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 msgid "List of Illustrations" msgstr "Índex d'il·lustracions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1461 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "List of Tables" msgstr "Índex de taules" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1462 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Notes" msgstr "Anotacions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1463 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 msgid "Preface" msgstr "Pròleg" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1464 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Main Text" msgstr "Text principal" @@ -3584,7 +3587,8 @@ msgstr "Opcions de generació de l'index HTML." #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Rating" msgstr "Valoració" @@ -4286,24 +4290,74 @@ msgstr "categories de l'explorador d'etiquetes que no s'han de mostrar" msgid "Choose Files" msgstr "Tria fitxers" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 +msgid "Books" +msgstr "Llibres" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:29 +msgid "EPUB Books" +msgstr "Llibres EPUB" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 +msgid "LRF Books" +msgstr "Llibres LRF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 +msgid "HTML Books" +msgstr "Llibres HTML" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +msgid "LIT Books" +msgstr "Llibres LIT" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 +msgid "MOBI Books" +msgstr "Llibres Mobi" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 +msgid "Topaz books" +msgstr "Llibres Topaz" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 +msgid "Text books" +msgstr "Llibres de text" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 +msgid "PDF Books" +msgstr "Llibres PDF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 +msgid "SNB Books" +msgstr "Llibres SNB" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 +msgid "Comics" +msgstr "Còmics" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 +msgid "Archives" +msgstr "Arxius" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 msgid "Add books" msgstr "Afegeix llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 msgid "Add books to the calibre library/device from files on your computer" msgstr "" "Afegeix llibres a la biblioteca/dispositiu des de fitxers de l'ordinador" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:54 msgid "Add books from a single directory" msgstr "Afegeix llibres des d'una carpeta" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:56 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" @@ -4312,7 +4366,7 @@ msgstr "" "carpeta, assumint que cada fitxer de llibre és el mateix llibre en diferents " "formats)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:60 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" @@ -4320,90 +4374,68 @@ msgstr "" "Afegeix llibres de carpetes, incloent les subcarpetes (diversos llibres per " "carpeta, assumint que cada fitxer de llibre és un llibre diferent)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:64 msgid "Add Empty book. (Book entry with no formats)" msgstr "Afegeix un llibre buit (entrada de llibre sense format)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65 msgid "Shift+Ctrl+E" msgstr "Maj+Ctrl+E" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66 msgid "Add from ISBN" msgstr "Afegeix a partir de l'ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68 +msgid "Add files to selected book records" +msgstr "Afegeix fitxers als registres de llibre seleccionats" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69 +msgid "Shift+A" +msgstr "Maj+A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89 +msgid "Are you sure" +msgstr "Segur?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90 +msgid "" +"Are you sure you want to add the same files to all %d books? If the " +"formatalready exists for a book, it will be replaced." +msgstr "" +"Segur que voleu afegir els mateixos fitxers a tots els %d llibres? Si ja " +"existeix el format per a un llibre, es sobreescriurà." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96 +msgid "Select book files" +msgstr "Seleccioneu els fitxers de llibre" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Adding" msgstr "S'està afegint" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "Creating book records from ISBNs" msgstr "S'esta creant els registres de llibres a partir dels ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 msgid "Uploading books to device." msgstr "S'està carregant llibres al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 -msgid "Books" -msgstr "Llibres" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 -msgid "EPUB Books" -msgstr "Llibres EPUB" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:213 -msgid "LRF Books" -msgstr "Llibres LRF" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:214 -msgid "HTML Books" -msgstr "Llibres HTML" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 -msgid "LIT Books" -msgstr "Llibres LIT" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 -msgid "MOBI Books" -msgstr "Llibres Mobi" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 -msgid "Topaz books" -msgstr "Llibres Topaz" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 -msgid "Text books" -msgstr "Llibres de text" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 -msgid "PDF Books" -msgstr "Llibres PDF" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 -msgid "SNB Books" -msgstr "Llibres SNB" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 -msgid "Comics" -msgstr "Còmics" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 -msgid "Archives" -msgstr "Arxius" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 msgid "Supported books" msgstr "Llibres compatibles" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +msgid "Select books" +msgstr "Seleccioneu els llibres" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 msgid "Merged some books" msgstr "S'han fusionat els llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 msgid "" "The following duplicate books were found and incoming book formats were " "processed and merged into your Calibre database according to your automerge " @@ -4413,21 +4445,21 @@ msgstr "" "s'han processat i fusionat a la base de dades del calibre d'acord amb els " "paràmetres de fusió automàtica." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 msgid "Failed to read metadata" msgstr "No s'ha pogut llegir les metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 msgid "Failed to read metadata from the following" msgstr "No s'ha pogut llegir les metadades dels següents" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:310 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "Add to library" msgstr "Afegeix a la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -4435,12 +4467,12 @@ msgstr "Afegeix a la biblioteca" msgid "No book selected" msgstr "No s'ha seleccionat cap llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "Aquests llibres són virtuals i no es poden afegir a la biblioteca:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 msgid "No book files found" msgstr "No s'han trobat llibres" @@ -4453,7 +4485,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Afegeix llibres a la biblioteca des del dispositiu connectat" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:561 msgid "Fetch annotations (experimental)" msgstr "Recull les anotacions (experimental)" @@ -4682,7 +4714,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 @@ -4718,15 +4750,15 @@ msgstr "" "No hi ha cap biblioteca del calibre a %s. Se suprimirà de la llista de " "biblioteques conegudes." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:782 msgid "Not allowed" msgstr "No està permès" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 msgid "" "You cannot change libraries while using the environment variable " "CALIBRE_OVERRIDE_DATABASE_PATH." @@ -4734,7 +4766,7 @@ msgstr "" "No es poden canviar de biblioteca si es fa servir la variable d'entorn " "«CALIBRE_OVERRIDE_DATABASE_PATH»." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "No podeu canviar les biblioteques mentre hi ha treballs en execució." @@ -4755,7 +4787,7 @@ msgid "Bulk convert" msgstr "Conversió en grup" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Cannot convert" msgstr "No es pot convertir" @@ -4886,14 +4918,14 @@ msgid "Main memory" msgstr "Memòria principal" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:495 msgid "Storage Card A" msgstr "Tarja de memòria A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 msgid "Storage Card B" msgstr "Tarja de memòria B" @@ -4906,11 +4938,11 @@ msgid "None of the selected books are on the device" msgstr "Cap dels llibres seleccionats són al dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:291 msgid "Deleting books from device." msgstr "S'està suprimint llibres del dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 msgid "" "Some of the selected books are on the attached device. Where do you " "want the selected files deleted from?" @@ -4918,7 +4950,7 @@ msgstr "" "Alguns dels llibres seleccionats són al dispositiu connectat. D'on " "voleu que se suprimeixin els fitxers seleccionats?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:258 msgid "" "The selected books will be permanently deleted and the files removed " "from your calibre library. Are you sure?" @@ -4926,7 +4958,7 @@ msgstr "" "Els llibres seleccionats se suprimiran permanentment i els fitxers es " "trauran de la biblioteca del calibre. N'esteu segur?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:283 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -5162,7 +5194,7 @@ msgstr "Notí­cies (RSS)" msgid "Fetching news from " msgstr "S'està recollint notícies de " -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:81 msgid " fetched." msgstr " s'ha recollit" @@ -5315,7 +5347,7 @@ msgid "Click the show details button to see which ones." msgstr "Feu clic a «Veure detalls» per saber quins són." #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Show book details" msgstr "Mostra detalls del llibre" @@ -5474,7 +5506,7 @@ msgid "The specified directory could not be processed." msgstr "La carpeta que s'ha indicat no es pot processar." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:838 msgid "No books" msgstr "Cap llibre" @@ -5645,11 +5677,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 @@ -5688,32 +5720,34 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Path" msgstr "Camí" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "Formats" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:981 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 msgid "Collections" msgstr "Col·leccions" @@ -5726,16 +5760,26 @@ msgstr "Feu clic per obrir" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 msgid "None" msgstr "Cap" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +msgid "Paste Cover" +msgstr "Enganxa la portada" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +msgid "Copy Cover" +msgstr "Copia la portada" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 msgid "Double-click to open Book Details window" msgstr "Feu doble clic per obrir la finestra de detalls del llibre" @@ -5815,7 +5859,7 @@ msgstr "sortida" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 @@ -6197,7 +6241,7 @@ msgid "Style the selected text block" msgstr "Aplica un estil al bloc de text seleccionat" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Normal" msgstr "Normal" @@ -7608,105 +7652,105 @@ msgstr "etiquetes que se suprimiran" msgid "No details available." msgstr "No hi ha detalls disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:187 msgid "Device no longer connected." msgstr "El dispositiu ja no està connectat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:310 msgid "Get device information" msgstr "Aconsegueix informació del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 msgid "Get list of books on device" msgstr "Aconsegueix la llista de llibres del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Get annotations from device" msgstr "Aconsegueix anotacions del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send metadata to device" msgstr "Envia les metadades al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:351 msgid "Send collections to device" msgstr "Envia les col·leccions al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 msgid "Upload %d books to device" msgstr "Carrega %d llibres al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 msgid "Delete books from device" msgstr "Suprimeix llibres del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Download books from device" msgstr "Descarrega llibres del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "View book on device" msgstr "Visualitza un llibre del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Set default send to device action" msgstr "Configura l'acció d'enviar al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 msgid "Send to main memory" msgstr "Envia a la memòria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 msgid "Send to storage card A" msgstr "Envia a la targeta de memòria A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 msgid "Send to storage card B" msgstr "Envia a la targeta de memòria B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Main Memory" msgstr "Memòria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send specific format to" msgstr "Envia un format concret a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:506 msgid "Send and delete from library" msgstr "Envia i suprimeix de la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Eject device" msgstr "Expulsa el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Error" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:612 msgid "Error communicating with device" msgstr "Error a la comunicació amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:299 msgid "No suitable formats" msgstr "No hi ha formats adequats" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:644 msgid "Select folder to open as device" msgstr "Selecciona la carpeta que s'obrirà com a dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:695 msgid "Error talking to device" msgstr "Hi ha hagut un error en comunicar-se amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -7714,69 +7758,69 @@ msgstr "" "Hi ha hagut un error de comunicació amb el dispositiu. Traieu-lo i torneu-lo " "a connectar i/o torneu a iniciar." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 msgid "Device: " msgstr "Dispositiu: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741 msgid " detected." msgstr " detectat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "selected to send" msgstr "seleccionat per enviar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 msgid "%i of %i Books" msgstr "%i de %i llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "0 of %i Books" msgstr "0 de %i llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 msgid "Choose format to send to device" msgstr "Tria el format que s'enviarà al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "No device" msgstr "No hi ha cap dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 msgid "Cannot send: No device is connected" msgstr "No s'ha pogut enviar: no hi ha cap dispositiu connectat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "No card" msgstr "Sense targeta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Cannot send: Device has no storage card" msgstr "No s'ha pogut enviar: el dispositiu no té targeta de memòria" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Auto convert the following books before uploading to the device?" msgstr "" "S'ha de convertir automàticament aquests llibres abans de carregar-los al " "dispositiu?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:964 msgid "Sending catalogs to device." msgstr "S'estan enviant els catàlegs al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1063 msgid "Sending news to device." msgstr "S'estan enviant les notícies al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1117 msgid "Sending books to device." msgstr "S'estan enviant els llibres al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." @@ -7785,11 +7829,11 @@ msgstr "" "un format adequat. Convertiu primer el(s) llibre(s) a un format compatible " "amb el vostre dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 msgid "No space on device" msgstr "No hi ha espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "

    No es pot desar llibres al dispositiu perquè no hi ha prou espai " @@ -8162,7 +8206,7 @@ msgstr "Trieu un format" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Format" msgstr "Format" @@ -8340,9 +8384,11 @@ msgstr "Ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "Data" @@ -8375,47 +8421,62 @@ msgstr "" msgid "Author sort" msgstr "Ordre per autor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 msgid "Invalid author name" msgstr "El nom de l'autor no és vàlid" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 msgid "Author names cannot contain & characters." msgstr "Els noms d'autor no poden contenir caràcters &." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "Manage authors" msgstr "Administra els autors" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Sort by author" msgstr "Ordena per autor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:76 msgid "Sort by author sort" msgstr "Ordena per ordre per autor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:77 msgid "" -"Reset all the author sort values to a value automatically generated from the " -"author. Exactly how this value is automatically generated can be controlled " -"via Preferences->Advanced->Tweaks" +"Reset all the author sort values to a value automatically\n" +"generated from the author. Exactly how this value is automatically\n" +"generated can be controlled via Preferences->Advanced->Tweaks" msgstr "" -"Restableix tots els valors d'ordre per autor a un valor generat " -"automàticament a partir de l'autor. Es pot controlar la manera exacta com es " -"genera automàticament aquest valor a Preferències->Avançat->Ajustos" +"Estableix tots els valors d'ordre per autor a un valor generat\n" +"automàticament a partir de l'autor. Es pot controlar la manera\n" +"exacta com es genera aquest valor a Preferències->Avançat->\n" +"Ajustaments" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:80 msgid "Recalculate all author sort values" msgstr "Torna a calcular tots els valors d'ordre per autor" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:81 +msgid "" +"Copy author sort to author for every author. You typically use this button\n" +"after changing Preferences->Advanced->Tweaks->Author sort name algorithm" +msgstr "" +"Copia l'ordre per autor a l'autor per a tots els autors. Normalment es fa\n" +"servir aquest botó després de canviar Preferències->Avançat->Ajustaments->\n" +"Algoritme d'ordre per autor" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:83 +msgid "Copy all author sort values to author" +msgstr "Copia tots els valors d'odre per autor a autor" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "Author Sort" msgstr "Ordre per autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 msgid "ISBN" msgstr "ISBN" @@ -8567,22 +8628,22 @@ msgid "Working" msgstr "S'està treballant..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Lower Case" msgstr "Minúscules" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 msgid "Upper Case" msgstr "Majúscules" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 msgid "Title Case" msgstr "Inicials en majúscula" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 msgid "Capitalize" msgstr "Posa en majúscules" @@ -9526,21 +9587,21 @@ msgid "Password needed" msgstr "Cal una contrasenya." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "Nom d'&usuari:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "&Contrasenya:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -9632,133 +9693,124 @@ msgstr "Afegeix un cerca desada nova" msgid "Change the contents of the saved search" msgstr "Canvieu el contingut de la cerca desada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 -msgid "&Search:" -msgstr "&Cerca:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +msgid "%s news sources" +msgstr "%s fonts de notícies" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "Need username and password" msgstr "Fa falta un nom d'usuari i una contrasenya" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "You must provide a username and/or password to use this news source." msgstr "" "Heu de donar un nom d'usuari i/o una contrasenya per a aquesta font de " "notícies." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 msgid "Account" msgstr "Compte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 msgid "(optional)" msgstr "(opcional)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 msgid "(required)" msgstr "(necessari)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 msgid "Created by: " msgstr "Creat per: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 msgid "Last downloaded: never" msgstr "Darrera descàrrega: mai" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 msgid "%d days, %d hours and %d minutes ago" msgstr "Fa %d dies, %d hores i %d minuts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 msgid "Last downloaded" msgstr "Darrera descàrrega" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 msgid "Schedule news download" msgstr "Planifica la descàrrega de notícies" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 msgid "Add a custom news source" msgstr "Afegeix una font nova de notícies" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 msgid "Download all scheduled new sources" msgstr "Descarrega totes les fonts de notícies planificades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 msgid "No internet connection" msgstr "No hi ha connexió a internet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 msgid "Cannot download news as no internet connection is active" msgstr "" "No es poden baixar notícies perquè no hi ha connexió d'internet activa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 -msgid "Recipes" -msgstr "Receptes" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +msgid "&Search:" +msgstr "&Cerca:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 -msgid "Download all scheduled recipes at once" -msgstr "Descarrega d'un cop totes les receptes que s'ha planificat" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 -msgid "Download &all scheduled" -msgstr "Descarrega &totes les que s'ha planificat" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "blurb" msgstr "publicitat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid "&Schedule for download:" msgstr "Planifica la de&scàrrega:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 msgid "Every " msgstr "Cada " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "day" msgstr "dia" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "Monday" msgstr "Dilluns" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Tuesday" msgstr "Dimarts" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "Wednesday" msgstr "Dimecres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "Thursday" msgstr "Dijous" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "Friday" msgstr "Divendres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Saturday" msgstr "Dissabte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Sunday" msgstr "Diumenge" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "at" msgstr "a" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." @@ -9766,52 +9818,108 @@ msgstr "" "Interval de descàrrega d'aquesta recepta. Un valor de zero implica que es " "descarregarà la recepta cada hora." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " dies" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 msgid "&Account" msgstr "Com&pte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 msgid "For the scheduling to work, you must leave calibre running." msgstr "" "Per tal que la planificació funcioni heu de deixar el calibre en execució." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 msgid "&Schedule" msgstr "&Planifica" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 msgid "Add &title as tag" msgstr "Afegeix el &títol com a etiqueta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 msgid "&Extra tags:" msgstr "&Etiquetes addcionals:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +msgid "" +"Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep " +"all (disable)." +msgstr "" +"Nombre màxim de còpies (exemplars) que es desaran d'aquesta recepta. Poseu-" +"hi «0» per desar-ho tot (inhabilita)." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +msgid "&Keep at most:" +msgstr "&Desa com a màxim:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +msgid "" +"

    When set, this option will cause calibre to keep, at most, the specified " +"number of issues of this periodical. Every time a new issue is downloaded, " +"the oldest one is deleted, if the total is larger than this number.\n" +"

    Note that this feature only works if you have the option to add the title " +"as tag checked, above.\n" +"

    Also, the setting for deleting periodicals older than a number of days, " +"below, takes priority over this setting." +msgstr "" +"

    Si s'activa, aquesta opció fa que el calibre conservi com a màxim el " +"nombre d'exemplars que s'especifiqui de la publicació. Cada cop que es " +"descarregui un exemplar nou el més vell se suprimeix, si el total és més " +"gran que aquest número.\n" +"

    Aquesta característica només funciona si heu activat l'opció d'afegir el " +"títol com a etiqueta, més amunt.\n" +"

    A més, l'opció de suprimir publicacions més antigues d'un nombre de dies, " +"més avall, té prioritat sobre aquesta opció." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +msgid "all issues" +msgstr "tots els exemplars" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +msgid " issues" +msgstr " exemplars" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 msgid "&Advanced" msgstr "&Avançat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 msgid "&Download now" msgstr "&Descarrega-ho ara" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "" -"Delete downloaded news older than the specified number of days. Set to zero " -"to disable." -msgstr "" -"Suprimeix les notícies que s'hagin descarregat més antigues que el nombre de " -"dies que s'indica. Introduïu zero per inhabilitar-ho." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +msgid "&Delete downloaded news older than:" +msgstr "&Suprimeix les notícies descarregades anteriors a:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "Delete downloaded news older than " -msgstr "Suprimeix les notícies més antigues que " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +msgid "" +"

    Delete downloaded news older than the specified number of days. Set to " +"zero to disable.\n" +"

    You can also control the maximum number of issues of a specific " +"periodical that are kept by clicking the Advanced tab for that periodical " +"above." +msgstr "" +"

    Suprimeix les notícies descarregades més antigues al nombre de dies que " +"s'especifica. Establiu-ho a zero per a inhabilitar-ho.\n" +"

    També podeu controlar el número màxim d'exemplars que es conserva d'una " +"publicació concreta fent clic a la pestanya «Avançat» per a la publicació." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +msgid "never delete" +msgstr "no suprimeixis mai" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +msgid "Download all scheduled news sources at once" +msgstr "Descarrega totes les fonts de notícies programades alhora" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +msgid "Download &all scheduled" +msgstr "Descarrega &totes les que s'ha planificat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 msgid "contains" @@ -9941,12 +10049,12 @@ msgid "Choose formats" msgstr "Tria de formats" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Authors" msgstr "Autors" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:136 msgid "Publishers" msgstr "Editorial" @@ -9955,12 +10063,12 @@ msgid " (not on any book)" msgstr " (a cap llibre)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:207 msgid "Invalid name" msgstr "El nom no és vàlid" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:208 msgid "" "That name contains leading or trailing periods, multiple periods in a row or " "spaces before or after periods." @@ -9968,19 +10076,19 @@ msgstr "" "Aquest nom conté punts al començament o al final, múltiples punts seguits o " "espais abans o després de punts." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions.py:151 msgid "Name already used" msgstr "El nom ja s'està utilitzant" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:216 msgid "That name is already used, perhaps with different case." msgstr "" "Aquest nom ja està en ús, potser amb majúscules/minúscules diferents." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:229 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "L'etiqueta actual s'esborrarà permanentment. N'esteu segur?" @@ -10103,12 +10211,12 @@ msgid "%s (was %s)" msgstr "%s (era %s)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1275 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 msgid "Item is blank" msgstr "L'element està en blanc" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "An item cannot be set to nothing. Delete it instead." msgstr "No es pot deixar un element en blanc. En tot cas l'heu d'esborrar." @@ -10295,6 +10403,10 @@ msgstr "Tria una recepta integrada" msgid "Choose a recipe file" msgstr "Tria un fitxer de recepta" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +msgid "Recipes" +msgstr "Receptes" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 msgid "" "You will lose any unsaved changes. To save your changes, click the " @@ -10570,34 +10682,34 @@ msgstr "l'explorador d'etiquetes" msgid "Shift+Alt+T" msgstr "Maj+Alt+T" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "versió" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "ha estat creat per Kovid Goyal" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:175 msgid "Connected " msgstr "Connectat " -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:188 msgid "Update found" msgstr "S'ha trobat una actualització" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:233 msgid "Book Details" msgstr "Detalls del llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Alt+D" msgstr "Alt+D" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:235 msgid "Shift+Alt+D" msgstr "Maj+Alt+D" @@ -10685,7 +10797,7 @@ msgid "Show books in the main memory of the device" msgstr "Mostra els llibres de la memòria principal del dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:943 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 msgid "Card A" msgstr "Targeta A" @@ -10694,7 +10806,7 @@ msgid "Show books in storage card A" msgstr "Mostra els llibres de la targeta de memòria A" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:945 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:997 msgid "Card B" msgstr "Targeta B" @@ -10767,12 +10879,12 @@ msgid "Edit template" msgstr "Edita la plantilla" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:251 msgid "On Device" msgstr "Al dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:301 msgid "Size (MB)" msgstr "Grandària (MB)" @@ -10780,34 +10892,68 @@ msgstr "Grandària (MB)" msgid "Book %s of %s." msgstr "Llibre %s de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +msgid "checked" +msgstr "activat" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:624 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:540 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:954 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "yes" +msgstr "sí" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +msgid "unchecked" +msgstr "desactivat" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:626 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:956 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 +msgid "no" +msgstr "no" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1308 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:748 msgid "The lookup/search name is \"{0}\"" msgstr "El nom de la cerca és «{0}»" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1310 msgid "This book's UUID is \"{0}\"" msgstr "L'UUID del llibre és «{0}»" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 msgid "In Library" msgstr "A la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:999 msgid "Size" msgstr "Mida" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 msgid "Book %s of %s." msgstr "Llibre %s de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1269 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1288 msgid "Marked for deletion" msgstr "S'ha marcat per suprimir" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1291 msgid "Double click to edit me

    " msgstr "Feu doble clic per a edittar>/b>
    -me" @@ -11165,7 +11311,7 @@ msgid "%s %s for: %s" msgstr "%s %s per a: %s" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:164 msgid "Done" msgstr "Acabat" @@ -11174,7 +11320,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "S'ha descarregat amb èxit les metadades de %d de %d llibres" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Details" msgstr "Detalls" @@ -11333,17 +11479,17 @@ msgstr "" msgid "&Configure metadata from file name" msgstr "&Configura les metadades a partir del nom de fitxer" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "High" msgstr "Alt" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Low" msgstr "Baix" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:165 msgid "Confirmation dialogs have all been reset" msgstr "S'ha reinicialitzat tot els diàlegs de confirmació" @@ -11435,7 +11581,7 @@ msgid "Do you really want to delete column %s and all its data?" msgstr "" "Esteu segur que voleu suprimir la columna %s i totes les seves dades?" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 msgid "" "Here you can re-arrange the layout of the columns in the calibre library " @@ -11446,22 +11592,30 @@ msgstr "" "la biblioteca del calibre. Podeu ocultar columnes si les desmarqueu. També " "podeu crear les vostres columnes personalitzades." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +msgid "Move column up" +msgstr "Puja la columna" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 msgid "Remove a user-defined column" msgstr "Suprimeix una columna definida per l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 msgid "Add a user-defined column" msgstr "Afegeix una columna definida per l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 msgid "Edit settings of a user-defined column" msgstr "Edita els paràmetres d'una columna definida per l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:96 +msgid "Move column down" +msgstr "Baixa la columna" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 msgid "Add &custom column" msgstr "Afegeix una &columna personalitzada" @@ -11474,66 +11628,108 @@ msgstr "" "Restaura els paràmetres als valors per defecte. Només es restauren els " "paràmetres de la secció que estigui seleccionada." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:18 msgid "Text, column shown in the tag browser" msgstr "Text, columna que es mostra a l'explorador d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:21 msgid "Comma separated text, like tags, shown in the tag browser" msgstr "" "Text separat per comes, com les etiquetes, que es mostra a l'explorador " "d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:24 msgid "Long text, like comments, not shown in the tag browser" msgstr "" "Text llarg, com els comentaris, que no es mostra a l'explorador d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:27 msgid "Text column for keeping series-like information" msgstr "Columna de text per mantenir informació com una sèrie" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:30 msgid "Text, but with a fixed set of permitted values" msgstr "Text, però amb un conjunt fix de valors permesos" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:34 msgid "Floating point numbers" msgstr "Nombre amb decimals" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:36 msgid "Integers" msgstr "Enters" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:38 msgid "Ratings, shown with stars" msgstr "Valoracions, es mostren amb estrelles" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:138 msgid "Yes/No" msgstr "Sí/No" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:43 msgid "Column built from other columns" msgstr "Columna generada a partir d'altres columnes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:51 +msgid "Create a custom column" +msgstr "Crea una columna personalitzada" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:62 +msgid "Quick create:" +msgstr "Creació ràpida:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:142 +msgid "Modified Date" +msgstr "Data de modificació" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Number" +msgstr "Nombre" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +msgid "Text" +msgstr "Text" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:87 +msgid "Edit a custom column" +msgstr "Modifica una columna personalitzada" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:91 msgid "No column selected" msgstr "No s'ha seleccionat cap columna" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:92 msgid "No column has been selected" msgstr "No s'ha seleccionat cap columna" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:96 msgid "Selected column is not a user-defined column" msgstr "La columna seleccionada no és una columna definida per l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +msgid "My Tags" +msgstr "Les meves etiquetes" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:140 +msgid "My Series" +msgstr "La meva sèrie" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:141 +msgid "My Rating" +msgstr "La meva valoració" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:168 msgid "No lookup name was provided" msgstr "No s'ha donat cap nom per a la cerca" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:170 msgid "" "The lookup name must contain only lower case letters, digits and " "underscores, and start with a letter" @@ -11541,7 +11737,7 @@ msgstr "" "El nom de la cerca només ha de contenir minúscules, números i barres baixes, " "i ha de començar amb una lletra" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:173 msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." @@ -11549,48 +11745,43 @@ msgstr "" "Els noms de cerca no poden acabar en _index perquè aquests noms estan " "reservats per als índexs d'una columna de sèrie." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:183 msgid "No column heading was provided" msgstr "No s'ha donat cap encapçalament de columna" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:193 msgid "The lookup name %s is already used" msgstr "El nom de cerca %s ja existeix" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:205 msgid "The heading %s is already used" msgstr "L'encapçalament %s ja existeix" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:216 msgid "You must enter a template for composite columns" msgstr "Heu d'introduir una plantilla per a les columnes compostes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:224 msgid "You must enter at least one value for enumeration columns" msgstr "S'ha d'introduir almenys un valor per a les columnes d'enumeració" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:228 msgid "You cannot provide the empty value, as it is included by default" msgstr "No es pot deixar el valor buit perquè s'inclou per defecte" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:232 msgid "The value \"{0}\" is in the list more than once" msgstr "El valor «{0}» està més d'un cop a la llista" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "Create or edit custom columns" -msgstr "Crea o edita columnes personalitzades" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:176 msgid "&Lookup name" msgstr "&Nom de la cerca" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:177 msgid "Column &heading" msgstr "&Encapçalament de la columna" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:178 msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." @@ -11598,22 +11789,22 @@ msgstr "" "Es fa servir per cercar dins la columna. Ha de contenir només números i " "minúscules." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:179 msgid "" "Column heading in the library view and category name in the tag browser" msgstr "" "Encapçalament de la columna a la vista de biblioteca i nom de la categoria a " "l'explorador d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 -msgid "Column &type" -msgstr "&Tipus de columna" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:180 +msgid "&Column type" +msgstr "Tipus de &columna" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:181 msgid "What kind of information will be kept in the column." msgstr "Tipus d'informació que hi haurà a la columna." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:182 msgid "" "

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " "for year.

    \n" @@ -11631,42 +11822,51 @@ msgstr "" "
  • dd MMMM yy dóna 05 Gener 10
  • \n" " " -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:188 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "Feu servir MMM yyyy per al mes i any, yyy per a només l'any" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:189 msgid "Default: dd MMM yyyy." msgstr "Fer defecte: dd MMM yyyy." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:190 msgid "Format for &dates" msgstr "Format per a les &dates" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:191 +msgid "&Template" +msgstr "&Plantilla" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:192 msgid "Field template. Uses the same syntax as save templates." msgstr "" "Plantilla de fitxer.. Utilitza la mateixa sintaxi que les plantilles de " "desar." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:193 msgid "Similar to save templates. For example, {title} {isbn}" msgstr "Semblant a les plantilles de desar. Per exemple, {title} {isbn}" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:202 msgid "Default: (nothing)" msgstr "Per defecte: (no res)" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 -msgid "&Template" -msgstr "&Plantilla" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:195 +msgid "&Sort/search column by" +msgstr "&Ordena/cerca la columna per" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:196 +msgid "How this column should handled in the GUI when sorting and searching" +msgstr "" +"Com s'ha de gestionar aquesta columna a la interfície en ordenar i cercar" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:197 msgid "Values" msgstr "Valors" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:198 msgid "" "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" @@ -11677,7 +11877,7 @@ msgstr "" "quatre\n" "valors, el primer és un valor buit." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:201 msgid "The empty string is always the first value" msgstr "El primer valor és sempre una cadena buida" @@ -12544,7 +12744,7 @@ msgstr "" "Preferències->Avançat->Connectors" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 msgid "Failed to start content server" msgstr "No s'ha pogut iniciar el servidor de continguts" @@ -13006,26 +13206,26 @@ msgid "Apply any changes you made to this tweak" msgstr "Aplica els canvis que s'ha fet a l'ajustament" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:646 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "Cerca" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:321 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" "La cerca seleccionada se suprimirà permanentment

    Click Find again to go to first match" msgstr "" "No hi ha més coincidències.

    Feu clic a «Cerca» per tornar a la " "primera coincidència." -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by name" msgstr "Ordena per nom" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2055 msgid "Sort by popularity" msgstr "Ordena per popularitat" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2056 msgid "Sort by average rating" msgstr "Ordena per valoració mitjana" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2059 msgid "Set the sort order for entries in the Tag Browser" msgstr "Estableix l'ordre de les entrades a l'explorador d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match all" msgstr "Fes-ho coincidir tot" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2003 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2065 msgid "Match any" msgstr "Qualsevol coincidència" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2008 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2070 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" "Quan es seleccionin múltiples entrades a l'explorador d'etiquetes fes que " "coincideixi una qualsevol o totes" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2012 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2074 msgid "Manage &user categories" msgstr "Administra les categories d'&usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2015 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2077 msgid "Add your own categories to the Tag Browser" msgstr "Afegiu les vostres categories a l'explorador d'etiquetes" @@ -13402,11 +13602,11 @@ msgstr "&Expulseu el dispositiu connectat" msgid "Calibre Quick Start Guide" msgstr "Guia d'inici ràpid del calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 msgid "Debug mode" msgstr "Mode de depuració" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:303 msgid "" "You have started calibre in debug mode. After you quit calibre, the debug " "log will be available in the file: %s

    The log will be displayed " @@ -13416,19 +13616,19 @@ msgstr "" "el registre de depuració estarà disponible al fitxer: %s

    El registre es " "mostrarà automàticament." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 msgid "Conversion Error" msgstr "Error de conversió" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Recipe Disabled" msgstr "Recepta inhabilitada" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:534 msgid "Failed" msgstr "Ha fallat" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:571 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. " @@ -13438,11 +13638,11 @@ msgstr "" "útil, considereu fer una donació per donar suport al seu desenvolupament. La " "vostra donació ajudarà que el desenvolupament del calibre continuï." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:597 msgid "There are active jobs. Are you sure you want to quit?" msgstr "Hi ha tasques actives. Segur que voleu sortir?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:600 msgid "" " is communicating with the device!
    \n" " Quitting may cause corruption on the device.
    \n" @@ -13452,11 +13652,11 @@ msgstr "" " Si sortiu podeu malmetre el dispositiu.
    \n" " Segur que voleu sortir?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 msgid "Active jobs" msgstr "Tasques actives" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -14005,35 +14205,27 @@ msgstr "Troba la coincidència anterior" msgid "Print eBook" msgstr "Imprimeix el llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:279 -msgid "Copy Image" -msgstr "Copia la imatge" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 -msgid "Paste Image" -msgstr "Enganxa la imatge" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Change Case" msgstr "Canvia la caixa" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Swap Case" msgstr "Intercanvia la caixa" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:955 msgid "Drag to resize" msgstr "Arrossega per canviar la mida" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:990 msgid "Show" msgstr "Mostra" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:997 msgid "Hide" msgstr "Amaga" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1034 msgid "Toggle" msgstr "Commuta" @@ -14386,50 +14578,28 @@ msgstr "" msgid "Turn on the &content server" msgstr "Engega el servidor de &continguts" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:319 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:330 msgid "today" msgstr "avui" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:322 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:333 msgid "yesterday" msgstr "ahir" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:325 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:336 msgid "thismonth" msgstr "aquest mes" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:328 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:329 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:339 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:340 msgid "daysago" msgstr "fa dies" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -msgid "unchecked" -msgstr "desactivat" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:579 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "no" -msgstr "no" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -msgid "checked" -msgstr "activat" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:582 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192 -msgid "yes" -msgstr "sí" - -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "blank" msgstr "en blanc" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:586 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "empty" msgstr "buit" @@ -14862,7 +15032,7 @@ msgstr "Els fitxers de portada no són a la base de dades" msgid "Folders raising exception" msgstr "Hi ha carpetes que donen errors" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:43 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:44 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." @@ -14870,7 +15040,7 @@ msgstr "" "Camí a la biblioteca del calibre. Per defecte es fa servir el que hi ha als " "paràmetres." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:123 msgid "" "%prog list [options]\n" "\n" @@ -14880,7 +15050,7 @@ msgstr "" "\n" "Llista dels llibres disponibles a la base de dades del calibre.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:130 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:131 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -14894,7 +15064,7 @@ msgstr "" "Per defecte: %%default. El camp especial «all» es pot fer servir per " "seleccionar tots els camps. Només té efecte en el format de sortida." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:138 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" @@ -14904,11 +15074,11 @@ msgstr "" "Camps disponibles: %s\n" "Per defecte: %%default." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:140 msgid "Sort results in ascending order" msgstr "Ordena els resultats en ordre ascendent" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search related documentation in the User Manual. Default is " @@ -14918,8 +15088,8 @@ msgstr "" "de cerca vegeu la documentació relacionada al Manual de l'usuari. Per " "defecte no es filtra." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1043 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." @@ -14927,12 +15097,12 @@ msgstr "" "Amplada màxima d'una línia a la sortida. Per defecte es detecta la mida de " "la pantalla." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 msgid "The string used to separate fields. Default is a space." msgstr "" "Cadena que es fa servir per separar els camps. Per defecte és un espai." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:145 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:146 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." @@ -14940,15 +15110,15 @@ msgstr "" "Prefix per a tots els camins dels fitxers. Per defecte és el camí d'accés a " "la carpeta de la biblioteca." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:167 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:168 msgid "Invalid fields. Available fields:" msgstr "Camps no vàlids. Camps disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:174 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:175 msgid "Invalid sort field. Available fields:" msgstr "Camp d'ordenació no vàlid. Camps disponibles:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:246 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:247 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" @@ -14956,7 +15126,7 @@ msgstr "" "No s'ha afegit els llibres següents perquè ja són a la base de dades (vegeu " "l'opció --duplicates):" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:271 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -14970,7 +15140,7 @@ msgstr "" "indicar carpetes, vegeu\n" "les opcions relacionades amb les carpetes més avall.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:279 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" @@ -14978,11 +15148,11 @@ msgstr "" "Assumeix que cada carpeta conté un sol llibre lògic i que tots els fitxers " "que hi ha són diferents formats del mateix llibre" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Process directories recursively" msgstr "Processa les carpetes de forma recursiva" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:283 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." @@ -14990,27 +15160,27 @@ msgstr "" "Afegeix els llibres a la base de dades encara que ja existeixin. La " "comparació es fa mitjançant els títols dels llibres." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:285 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Add an empty book (a book with no formats)" msgstr "Afegeix un llibre en blanc (sense formats)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:287 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the title of the added empty book" msgstr "Estableix el títol del llibre en blanc que s'ha afegit" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:289 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:290 msgid "Set the authors of the added empty book" msgstr "Estableix els autors del llibre en blanc que s'ha afegit" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:291 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:292 msgid "Set the ISBN of the added empty book" msgstr "Estableix l'ISBN del llibre en blanc que s'ha afegit" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:317 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:318 msgid "You must specify at least one file to add" msgstr "Heu d'especificar almenys un camp per afegir" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:334 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:335 msgid "" "%prog remove ids\n" "\n" @@ -15024,11 +15194,11 @@ msgstr "" "una llista separada per comes de números d'identificació (els podeu obtenir " "amb el comandament «list»). Per exemple, 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:349 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:350 msgid "You must specify at least one book to remove" msgstr "Heu d'especificar almenys un llibre per suprimir" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:368 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:369 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -15042,15 +15212,15 @@ msgstr "" "identificat per ID. Podeu aconseguir l'ID amb el comandament «list». Si el " "format ja existeix es sobreescriurà.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "You must specify an id and an ebook file" msgstr "Heu d'especificar una ID i un fitxer de llibre" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:388 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:389 msgid "ebook file must have an extension" msgstr "Els fitxers de llibre han de tenir una extensió" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:396 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:397 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -15067,11 +15237,11 @@ msgstr "" "extensió de fitxer com LRF, TXT o EPUB. Si el llibre lògic no té el format " "que s'especifica no es farà res\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:413 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:414 msgid "You must specify an id and a format" msgstr "Heu d'especificar una ID i un format" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:431 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:432 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -15087,15 +15257,15 @@ msgstr "" "que identifica l'ID.\n" "ID és un número obtingut amb l'ordre «list».\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:439 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:440 msgid "Print metadata in OPF form (XML)" msgstr "Imprimeix les metadades en format OPF (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:448 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:449 msgid "You must specify an id" msgstr "Heu d'especificar una ID" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:463 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:464 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -15118,11 +15288,11 @@ msgstr "" "comandament\n" "«show_metadata».\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:479 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:480 msgid "You must specify an id and a metadata file" msgstr "Heu d'especificar una ID i un fitxer de metadades" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:499 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "" "%prog export [options] ids\n" "\n" @@ -15140,28 +15310,28 @@ msgstr "" "metadades (a un\n" "fitxer opf). Podeu aconseguir les IDs amb el comandament «list».\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:508 msgid "Export all books in database, ignoring the list of ids." msgstr "" "Exporta tots els llibres de la base de dades, ignorant la llista d'IDs." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:510 msgid "Export books to the specified directory. Default is" msgstr "Exporta els llibres a la carpeta que s'indica. Per defecte és" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:512 msgid "Export all books into a single directory" msgstr "Exporta tots els llibres a una carpeta" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:518 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:519 msgid "Specifying this switch will turn this behavior off." msgstr "Si indiqueu aquesta opció es desactiva aquest comportament." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:542 msgid "You must specify some ids or the %s option" msgstr "Heu d'indicar alguna ID o l'opció %s" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:555 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -15178,7 +15348,7 @@ msgstr "" "espais ni dos punts. El nom és el nom visible de la columna. El tipus de " "dades és un de: {0}\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:563 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:564 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." @@ -15186,7 +15356,7 @@ msgstr "" "Aquesta columna emmagatzema les etiquetes com a dades (amb valors separats " "per comes). Només s'aplica si les dades són de tipus text." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:567 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:568 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted. This is a JSON string. For enumeration columns, use --" @@ -15196,11 +15366,11 @@ msgstr "" "columna. És una cadena JSON. Per a les columnes d'enumeració utilitzeu --" "display='{\"enum_values\":[\"val1\", \"val2\"]}'" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:582 msgid "You must specify label, name and datatype" msgstr "Heu d'indicar etiqueta, nom i tipus de dades" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:643 msgid "" "\n" " %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" @@ -15219,7 +15389,7 @@ msgstr "" "genera.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" @@ -15229,7 +15399,7 @@ msgstr "" "Si es declara, s'ignora --search.\n" "Per defecte: totes" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:661 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" @@ -15239,16 +15409,16 @@ msgstr "" "documentació del tema al Manual de l'usuari.\n" "Per defecte: sense filtre" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:667 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "Mostra informació de sortida detallada. Útil per a depurar" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:680 msgid "Error: You must specify a catalog output file" msgstr "Error: Heu d'indicar un fitxer de sortida del catàleg" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:725 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:726 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -15269,7 +15439,7 @@ msgstr "" " comandament custom_columns.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:737 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." @@ -15277,11 +15447,11 @@ msgstr "" "Si la columna conté múltiples valors, afegeix els valors que s'indiquen als " "que ja hi ha, en lloc de substituir-los." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 msgid "Error: You must specify a field name, id and value" msgstr "Error: Heu d'indicar un nom de camp, ID i valor" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:767 msgid "" "\n" " %prog custom_columns [options]\n" @@ -15296,19 +15466,19 @@ msgstr "" "etiquetes de columna i les IDs.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:773 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "Show details for each column." msgstr "Mostra els detalls de cada columna." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:785 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "Perdreu totes les dades de la columna %r. N'esteu segur (s/n)? " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "y" msgstr "s" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:793 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:794 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -15325,15 +15495,15 @@ msgstr "" " les columnes disponibles amb el comandament custom_columns.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:801 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:802 msgid "Do not ask for confirmation" msgstr "No demanis confirmació" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:811 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:812 msgid "Error: You must specify a column label" msgstr "Error: Heu d'indicar una etiqueta per a la columna" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:822 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -15355,39 +15525,39 @@ msgstr "" " es sobreescriurà.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:840 msgid "Error: You must specify an action (add|remove|list)" msgstr "Error: Heu d'indicar una acció (add/remove/list)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 msgid "Name:" msgstr "Nom:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "Search string:" msgstr "Cadena de cerca:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:855 msgid "Error: You must specify a name and a search string" msgstr "Error: Heu d'indicar un nom i una cadena de cerca" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:858 msgid "added" msgstr "s'ha afegit" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:863 msgid "Error: You must specify a name" msgstr "Error: Heu d'indicar un nom" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "removed" msgstr "s'ha suprimit" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:869 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:870 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "Error: No es reconeix l'acció %s, ha de ser una de «add/remove/list»" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:877 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:878 msgid "" "%prog check_library [options]\n" "\n" @@ -15399,12 +15569,12 @@ msgstr "" "Fes algunes comprovacions al sistema de fitxers que hi ha en una biblioteca. " "Els resultats són {0}\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:884 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1035 msgid "Output in CSV" msgstr "Sortida CSV" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:888 msgid "" "Comma-separated list of reports.\n" "Default: all" @@ -15412,7 +15582,7 @@ msgstr "" "Llista d'informes separats per comes.\n" "Per defecte: tots" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:891 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:892 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" @@ -15420,7 +15590,7 @@ msgstr "" "Llista de les extensions que s'ignoraran separada per comes.\n" "Per defecte: totes" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:895 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:896 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" @@ -15428,11 +15598,11 @@ msgstr "" "Llista de noms que s'ignoraran separats per comes.\n" "Per defecte: tots" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:925 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:926 msgid "Unknown report check" msgstr "Informe de comprovació desconegut" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:958 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:959 msgid "" "%prog restore_database [options]\n" "\n" @@ -15462,7 +15632,7 @@ msgstr "" "OPF.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:973 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:974 msgid "" "Really do the recovery. The command will not run unless this option is " "specified." @@ -15470,11 +15640,11 @@ msgstr "" "Fer la recuperació. El comandament no s'executa si no s'especifica aquesta " "opció." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:986 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:987 msgid "You must provide the %s option to do a recovery" msgstr "Heu d'introduir l'opció %s per fer una recuperació" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1023 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1024 msgid "" "%prog list_categories [options]\n" "\n" @@ -15487,7 +15657,7 @@ msgstr "" "La\n" "informació equival al que es mostra a la subfinestra d'etiquetes.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1031 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1032 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" @@ -15495,7 +15665,7 @@ msgstr "" "Genera només la sortida del nombre d'elements en una categoria en lloc del " "recompte per element a cada categoria" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "" "The character to put around the category value in CSV mode. Default is " "quotes (\")." @@ -15503,7 +15673,7 @@ msgstr "" "El caràcter que es posarà al voltant del valor de la categoria en mode CSV. " "Per defecte són les cometes (\")." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1040 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" @@ -15511,17 +15681,17 @@ msgstr "" "Llista separada per comes dels noms de la categoria de cerca.\n" "Per defecte: all" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1046 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" "La cadena que es farà servir per separar els camps en mode CSV. Per defecte " "és una coma." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1083 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1084 msgid "CATEGORY ITEMS" msgstr "ELEMENTS DE LES CATEGORIES" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1152 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1153 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -15554,40 +15724,44 @@ msgstr "" "L'etiqueta només pot contenir lletres minúscules, nombres i guions baixos, i " "ha de començar amb una lletra" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:62 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:63 msgid "%sAverage rating is %3.1f" msgstr "%sLa valoració mitjana és %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:941 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:993 msgid "Main" msgstr "Inici" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2775 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2951 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" "

    S'està migrant la base de dades antiga a la biblioteca de %s

    " -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2980 msgid "Copying %s" msgstr "S'està copiant %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2997 msgid "Compacting database" msgstr "S'està compactant la base de dades" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:148 msgid "Ratings" msgstr "Valoracions" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:181 +msgid "Identifiers" +msgstr "Identificadors" + +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:291 msgid "Title Sort" msgstr "Ordre per títols" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:125 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 msgid "Processed" msgstr "Processat" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:191 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 msgid "creating custom column " msgstr "s'està creant una columna personalitzada " @@ -15887,35 +16061,35 @@ msgstr "a" msgid "Books in" msgstr "llibres a" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:732 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:734 msgid "Other formats" msgstr "Altres formats" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:739 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Read %(title)s in the %(fmt)s format" msgstr "Llegeix %(title)s en el format %(fmt)s" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:744 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:746 msgid "Get" msgstr "Aconsegueix" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 msgid "Permalink" msgstr "Enllaç permanent" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "A permanent link to this book" msgstr "Un enllaç permanent a aquest llibre" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:771 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:773 msgid "This book has been deleted" msgstr "S'ha suprimit el llibre" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:857 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 msgid "in search" msgstr "en una cerca" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:859 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:861 msgid "Matching books" msgstr "Llibres coincidents" @@ -16148,15 +16322,15 @@ msgstr "%s: funció desconeguda" msgid "No such variable " msgstr "Aquesta variable no existeix " -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:57 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:58 msgid "No documentation provided" msgstr "No s'ha facilitat cap documentació" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:79 msgid "Exception " msgstr "Excepció " -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:96 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:97 msgid "" "strcmp(x, y, lt, eq, gt) -- does a case-insensitive comparison of x and y as " "strings. Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." @@ -16165,7 +16339,7 @@ msgstr "" "i minúscules, de x i y com a cadenes. if x < y. S'obté «eq» si x == y. En " "cas contrari s'obté «gt»." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:112 msgid "" "cmp(x, y, lt, eq, gt) -- compares x and y after converting both to numbers. " "Returns lt if x < y. Returns eq if x == y. Otherwise returns gt." @@ -16174,7 +16348,7 @@ msgstr "" "números. S'obté «lt» si x < y. S'obté «eq» si x == y. En la resta de casos " "s'obté «gt»." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:126 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:127 msgid "" "strcat(a, b, ...) -- can take any number of arguments. Returns a string " "formed by concatenating all the arguments" @@ -16182,33 +16356,33 @@ msgstr "" "strcat(a, b, ...) -- pot prendre qualsevol nombre d'arguments. S'obté una " "cadena formada per la concatenació de tots els arguments" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:139 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:140 msgid "" "add(x, y) -- returns x + y. Throws an exception if either x or y are not " "numbers." msgstr "add(x, y) -- s'obté x + y. Dóna un error si x o y no són nombres." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:149 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:150 msgid "" "subtract(x, y) -- returns x - y. Throws an exception if either x or y are " "not numbers." msgstr "" "subtract(x, y) -- s'obté x - y. Dóna un error si x o y no són nombres." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:159 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:160 msgid "" "multiply(x, y) -- returns x * y. Throws an exception if either x or y are " "not numbers." msgstr "" "multiply(x, y) -- s'obté x * y. Dóna un error si x o y no són nombres." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:169 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:170 msgid "" "divide(x, y) -- returns x / y. Throws an exception if either x or y are not " "numbers." msgstr "divide(x, y) -- s'obté x / y. Dóna un error si x o y no són nombres." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:179 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:180 msgid "" "template(x) -- evaluates x as a template. The evaluation is done in its own " "context, meaning that variables are not shared between the caller and the " @@ -16224,7 +16398,7 @@ msgstr "" "converteixen automàticament. Per exemple, template('[[ordena_títols]]') " "avaluarà la plantilla {ordena_títols} i s'obtindrà el seu valor." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:194 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:195 msgid "" "eval(template) -- evaluates the template, passing the local variables (those " "'assign'ed to) instead of the book metadata. This permits using the " @@ -16235,7 +16409,7 @@ msgstr "" "processador de plantilles per construir resultats complexos de variables " "locals." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:207 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:208 msgid "" "assign(id, val) -- assigns val to id, then returns val. id must be an " "identifier, not an expression" @@ -16243,7 +16417,7 @@ msgstr "" "assign(id, val) -- assigna «val» a «id» i s'obté «val». «id» ha de ser un " "identificador, no una expressió." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218 msgid "" "print(a, b, ...) -- prints the arguments to standard output. Unless you " "start calibre from the command line (calibre-debug -g), the output will go " @@ -16253,11 +16427,19 @@ msgstr "" "esteu fent servir el calibre des de la línia de comandaments (calibre-debug-" "g), la sortida anirà a un forat negre." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:228 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229 msgid "field(name) -- returns the metadata field named by name" msgstr "field(nom) -- s'obté el camp de metadades identificat per «nom»" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:236 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:237 +msgid "" +"raw_field(name) -- returns the metadata field named by name without applying " +"any formatting." +msgstr "" +"raw_field(nom) -- s'obté el camp de metadades anomenat «nom» sense aplicar " +"cap format." + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:246 msgid "" "substr(str, start, end) -- returns the start'th through the end'th " "characters of str. The first character in str is the zero'th character. If " @@ -16273,7 +16455,7 @@ msgstr "" "caràcter. Per exemple, amb substr('12345', 1, 0) s'obté «2345», i amb " "substr('12345', 1, -1) s'obté «234»." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:249 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:259 msgid "" "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, " "except the arguments are field (metadata) names, not text. The value of the " @@ -16289,11 +16471,11 @@ msgstr "" "camp compost ja que les columnes compostes són camps. És molt útil quan per " "dissenyar camins per desar variables." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:264 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274 msgid "lookup requires either 2 or an odd number of arguments" msgstr "«lookup» necessita un 2 o un número senar d'arguments" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:276 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:286 msgid "" "test(val, text if not empty, text if empty) -- return `text if not empty` if " "the field is not empty, otherwise return `text if empty`" @@ -16301,7 +16483,7 @@ msgstr "" "test(val, text si no està buit, text si està buit) -- s'obté «text si no " "està buit» si el camp no està buit, «text si està buit» en cas contrari" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:288 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:298 msgid "" "contains(val, pattern, text if match, text if not match) -- checks if field " "contains matches for the regular expression `pattern`. Returns `text if " @@ -16312,7 +16494,7 @@ msgstr "" "«text si coincideix» si hi ha coincidències, «text si no coincideix» en cas " "contrari" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:303 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:313 msgid "" "switch(val, pattern, value, pattern, value, ..., else_value) -- for each " "`pattern, value` pair, checks if the field matches the regular expression " @@ -16324,11 +16506,11 @@ msgstr "" "camp coincideix amb l'expressió regular «patró» i s'obté «valor» si és així. " "Si no coincideix cap patró s'obté «no_valor»" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:311 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:321 msgid "switch requires an odd number of arguments" msgstr "«switch» necessita un número senar d'arguments" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:323 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:333 msgid "" "re(val, pattern, replacement) -- return the field after applying the regular " "expression. All instances of `pattern` are replaced with `replacement`. As " @@ -16339,7 +16521,7 @@ msgstr "" "es trobin. Com tot en el calibre, han de ser expressions regulars " "compatibles amb python" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:334 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344 msgid "" "ifempty(val, text if empty) -- return val if val is not empty, otherwise " "return `text if empty`" @@ -16347,7 +16529,7 @@ msgstr "" "ifempty(val, text si és buit) -- s'obté «val» si «val» no està buit, en cas " "contrari s'obté «text si és buit»" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:346 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:356 msgid "" "shorten(val, left chars, middle text, right chars) -- Return a shortened " "version of the field, consisting of `left chars` characters from the " @@ -16372,7 +16554,7 @@ msgstr "" "la dreta i la llargària del «text al mig», es fa servir el camp sense " "canviar-lo. Per exemple «La Catedral» no canviaria." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:371 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381 msgid "" "count(val, separator) -- interprets the value as a list of items separated " "by `separator`, returning the number of items in the list. Most lists use a " @@ -16384,7 +16566,7 @@ msgstr "" "majoria de llistes fan servir una coma com a separador, però per als autors " "es fa servir el signe &. Exemples: {tags:count(,)}, {authors:count(&)}" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:382 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:392 msgid "" "list_item(val, index, separator) -- interpret the value as a list of items " "separated by `separator`, returning the `index`th item. The first item is " @@ -16398,7 +16580,17 @@ msgstr "" "Si l'element no és a la llista s'obté un valor buit. El separador té el " "mateix significat que a la funció «count»." -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:402 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:412 +msgid "" +"select(val, key) -- interpret the value as a comma-separated list of items, " +"with the items being \"id:value\". Find the pair with theid equal to key, " +"and return the corresponding value." +msgstr "" +"select(val, clau) -- interpreta el valor com a una llista d'elements " +"separats per comes, amb els elements en la forma «id:valor». Troba la " +"parella amb «id» igual a «clau» i s'obté el valor corresponent." + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429 msgid "" "sublist(val, start_index, end_index, separator) -- interpret the value as a " "list of items separated by `separator`, returning a new list made from the " @@ -16419,20 +16611,46 @@ msgstr "" "C
    {#gènere:sublist(0,1,.)} s'obté A
    {#gènere:sublist(0,-1,.)} s'obté " "A.B" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:430 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:457 +msgid "" +"format_date(val, format_string) -- format the value, which must be a date " +"field, using the format_string, returning a string. The formatting codes " +"are: d : the day as number without a leading zero (1 to 31) dd : the " +"day as number with a leading zero (01 to 31) ddd : the abbreviated " +"localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day " +"name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a " +"leading zero (1 to 12). MM : the month as number with a leading zero (01 " +"to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to " +"\"Dec\"). MMMM : the long localized month name (e.g. \"January\" to " +"\"December\"). yy : the year as two digit number (00 to 99). yyyy : the " +"year as four digit number." +msgstr "" +"format_date(val, cadena_format) -- dóna format a un valor que ha de ser un " +"camp de data seguint el format «cadena_format» i s'obté una cadena. Els " +"codis de format són: «d» -el dia com a nombre sense zero inicial (d'1 a 31)-" +". «dd» -el dia com a nombre amb zero inicial (de 01 a 31)-. «ddd» -el nom " +"del dia abreujat en l'idioma local (de «dil» a «diu»)-. «dddd» -el nom " +"complet del dia en l'idioma local (de «dilluns» a «diumenge»)-. «M» -el mes " +"com a nombre sense zero inicial (d'1 a 12)-. «MM» -el mes com a nombre amb " +"zero inicial (de 01 a 12)-. «MMM» -el nom del mes abreujat en l'idioma local " +"(de «gen» a «des»)-. «MMMM» -el nom complet del mes en l'idioma local (de " +"«gener» a «desembre»)-. «yy» -l'any com a nombre de dues xifres (de «00» a " +"«99»)-. «yyyy» -l'any com a nombre de quatre xifres-." + +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:484 msgid "uppercase(val) -- return value of the field in upper case" msgstr "uppercase(val) -- s'obté el valor del camp en majúscules" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492 msgid "lowercase(val) -- return value of the field in lower case" msgstr "lowercase(val) -- s'obté el valor del camp en minúscules" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:446 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:500 msgid "titlecase(val) -- return value of the field in title case" msgstr "" "titlecase(val) -- s'obté el valor del camp amb les inicials en majúscula" -#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454 +#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:508 msgid "capitalize(val) -- return value of the field capitalized" msgstr "" "capitalize(val) -- s'obté el valor del camp amb la primera lletra en " @@ -17545,6 +17763,15 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ msgid "Run the check" #~ msgstr "Executa la comprobació" +#~ msgid "" +#~ "Reset all the author sort values to a value automatically generated from the " +#~ "author. Exactly how this value is automatically generated can be controlled " +#~ "via Preferences->Advanced->Tweaks" +#~ msgstr "" +#~ "Restableix tots els valors d'ordre per autor a un valor generat " +#~ "automàticament a partir de l'autor. Es pot controlar la manera exacta com es " +#~ "genera automàticament aquest valor a Preferències->Avançat->Ajustos" + #~ msgid "" #~ "No metadata found, try adjusting the title and author or the ISBN key." #~ msgstr "" @@ -17662,6 +17889,9 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ "El camp on es posarà el text després de totes les substitucions. Se està en " #~ "blanc es fa servir el camp original." +#~ msgid "Download all scheduled recipes at once" +#~ msgstr "Descarrega d'un cop totes les receptes que s'ha planificat" + #~ msgid "Contains: the word or phrase matches anywhere in the metadata" #~ msgstr "Conté: la paraula o frase està a qualsevol lloc de les metadades" @@ -17752,6 +17982,12 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ msgid "Tags to apply when adding a book:" #~ msgstr "Etiquetes que s'aplicaran quan s'afegeixi un llibre:" +#~ msgid "Create or edit custom columns" +#~ msgstr "Crea o edita columnes personalitzades" + +#~ msgid "Column &type" +#~ msgstr "&Tipus de columna" + #~ msgid "

    Field template. Uses the same syntax as save templates." #~ msgstr "" #~ "

    Plantilla de camp. Fa servir la mateixa sintaxi que les plantilles de " @@ -17997,6 +18233,13 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ msgid "You must provide the --really-do-it option to do a recovery" #~ msgstr "Heu d'introduir l'opció --really-do-it per fer la recuperació" +#~ msgid "" +#~ "Delete downloaded news older than the specified number of days. Set to zero " +#~ "to disable." +#~ msgstr "" +#~ "Suprimeix les notícies que s'hagin descarregat més antigues que el nombre de " +#~ "dies que s'indica. Introduïu zero per inhabilitar-ho." + #~ msgid "Download covers from librarything.com" #~ msgstr "Descarrega portades des de librarything.com" @@ -18052,6 +18295,9 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ "No s'ha pogut aconseguir l'article. Executeu el programa amb -vv per veure'n " #~ "el motiu" +#~ msgid "Delete downloaded news older than " +#~ msgstr "Suprimeix les notícies més antigues que " + #~ msgid "Send specific format" #~ msgstr "Envia un format específic" @@ -18375,6 +18621,12 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ "No hi ha llibres per catalogar\n" #~ "Comproveu les etiquetes d'exclusió" +#~ msgid "Copy Image" +#~ msgstr "Copia la imatge" + +#~ msgid "Paste Image" +#~ msgstr "Enganxa la imatge" + #~ msgid "Use a wizard to help construct the XPath expression" #~ msgstr "Utilitza un assistent d'ajuda per construir l'expressió XPath" diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 0ff8a11443..27117db60d 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.48\n" -"POT-Creation-Date: 2011-03-04 12:40+MST\n" -"PO-Revision-Date: 2011-03-04 12:40+MST\n" +"Project-Id-Version: calibre 0.7.49\n" +"POT-Creation-Date: 2011-03-11 12:26+MST\n" +"PO-Revision-Date: 2011-03-11 12:26+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -31,10 +31,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:660 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:455 -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 +#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 +#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:423 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:430 #: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:127 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:102 @@ -82,9 +82,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:884 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:986 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1052 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:994 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:999 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1065 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -110,8 +110,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:63 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:81 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:101 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:312 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:308 @@ -132,29 +132,29 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:366 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:988 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1181 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:199 #: /home/kovid/work/calibre/src/calibre/library/cli.py:216 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:486 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:492 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:494 #: /home/kovid/work/calibre/src/calibre/library/database2.py:502 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2790 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2792 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2925 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:513 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1716 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1826 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2806 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2939 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 @@ -432,7 +432,7 @@ msgid "Setup the calibre Content Server which will give you access to your calib msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:995 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:268 msgid "Plugins" msgstr "" @@ -673,11 +673,11 @@ msgstr "" msgid "Communicate with Android phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:83 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:86 msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:133 msgid "Communicate with S60 phones." msgstr "" @@ -706,14 +706,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:380 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:949 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:989 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2971 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3011 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2976 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3016 msgid "%d of %d" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:387 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:994 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3017 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3022 msgid "finished" msgstr "" @@ -738,7 +738,7 @@ msgid "" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2552 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2557 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:100 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 @@ -746,23 +746,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:915 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:945 #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:71 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:288 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2654 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:445 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:293 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:306 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2668 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:159 msgid "News" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2558 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2616 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2634 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2630 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2648 msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2875 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2880 msgid "Communicate with iTunes." msgstr "" @@ -1045,7 +1045,7 @@ msgid "The Kobo supports only one collection currently: the \"Im_Reading\" list. msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:383 msgid "Not Implemented" msgstr "" @@ -1179,7 +1179,7 @@ msgid "Set this option if you want the cover thumbnails to have the same aspect msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:190 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:69 msgid "Unnamed" msgstr "" @@ -1310,83 +1310,83 @@ msgstr "" msgid "Get device information..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:190 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:197 msgid "Rendered %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:193 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:200 msgid "Failed %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:247 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:254 msgid "" "Failed to process comic: \n" "\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:266 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:273 msgid "Number of colors for grayscale image conversion. Default: %default. Values of less than 256 may result in blurred text on your device if you are creating your comics in EPUB format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:270 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:277 msgid "Disable normalize (improve contrast) color range for pictures. Default: False" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:273 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:280 msgid "Maintain picture aspect ratio. Default is to fill the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:275 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:282 msgid "Disable sharpening." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:277 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:284 msgid "Disable trimming of comic pages. For some comics, trimming might remove content as well as borders." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:280 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:287 msgid "Don't split landscape images into two portrait images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:282 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:289 msgid "Keep aspect ratio and scale image using screen height as image width for viewing in landscape mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:285 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:292 msgid "Used for right-to-left publications like manga. Causes landscape pages to be split into portrait pages from right to left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:289 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:296 msgid "Enable Despeckle. Reduces speckle noise. May greatly increase processing time." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:292 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:299 msgid "Don't sort the files found in the comic alphabetically by name. Instead use the order they were added to the comic." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:296 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:303 msgid "The format that images in the created ebook are converted to. You can experiment to see which format gives you optimal size and look on your device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:307 msgid "Apply no processing to the image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:302 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:309 msgid "Do not convert the image to grayscale (black and white)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:311 msgid "Specify the image size as widthxheight pixels. Normally, an image size is automatically calculated from the output profile, this option overrides it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:315 msgid "When converting a CBC do not add links to each page to the TOC. Note this only applies if the TOC has more than one section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:447 -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:459 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:454 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:466 msgid "Page" msgstr "" @@ -2174,14 +2174,14 @@ msgid "TEMPLATE ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:553 msgid "No" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:576 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:553 msgid "Yes" msgstr "" @@ -2192,9 +2192,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:993 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:331 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:576 msgid "Title" msgstr "" @@ -2202,8 +2202,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:423 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:994 msgid "Author(s)" msgstr "" @@ -2219,36 +2219,36 @@ msgid "Producer" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:662 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:247 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1200 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:211 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:664 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:31 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1196 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:755 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Tags" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:65 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Series" @@ -2259,7 +2259,7 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:669 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1191 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 msgid "Timestamp" msgstr "" @@ -2362,23 +2362,23 @@ msgstr "" msgid "Cover download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:81 msgid "Download covers from openlibrary.org" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:111 msgid "ISBN: %s not found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:121 msgid "Download covers from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:205 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:211 msgid "Download covers from Douban.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:214 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:220 msgid "Douban.com API timed out. Try again later." msgstr "" @@ -2606,7 +2606,7 @@ msgid "Cover saved to file " msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1346 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1471 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 msgid "Cover" msgstr "" @@ -2655,70 +2655,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1472 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1473 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1474 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1475 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1488 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1476 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1489 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1477 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1490 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1478 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1491 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1479 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1492 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1480 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1493 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1481 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1494 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1482 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1495 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1483 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1496 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1484 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1497 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1485 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1498 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1486 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1499 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1487 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1500 msgid "Main Text" msgstr "" @@ -2740,7 +2740,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:66 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:751 msgid "Rating" msgstr "" @@ -3351,42 +3351,42 @@ msgstr "" msgid "Creating book records from ISBNs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:248 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:312 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:283 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:286 msgid "Select books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:323 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:324 msgid "The following duplicate books were found and incoming book formats were processed and merged into your Calibre database according to your automerge settings:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:344 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:345 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:390 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:371 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3394,11 +3394,11 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:384 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:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:390 msgid "No book files found" msgstr "" @@ -3557,7 +3557,7 @@ msgid "Note that the actual library folder will be renamed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:199 msgid "Already exists" msgstr "" @@ -3576,11 +3576,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:368 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:424 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:430 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:274 msgid "Are you sure?" msgstr "" @@ -3611,8 +3611,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:284 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:338 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:340 msgid "Success" msgstr "" @@ -3623,7 +3623,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:689 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:911 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:963 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:276 @@ -4051,7 +4051,7 @@ msgid "Move to next highlighted match" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/next_match.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:354 msgid "N" msgstr "" @@ -4172,7 +4172,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:758 msgid "Show book details" msgstr "" @@ -4359,32 +4359,32 @@ msgstr "" msgid "Saved" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:56 msgid "Searching for sub-folders" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:61 msgid "Searching for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:73 msgid "Looking for duplicates based on file hash" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:135 msgid "Invalid root folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:136 msgid "is not a valid root folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:146 msgid "Add books to calibre" msgstr "" @@ -4433,12 +4433,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 #: /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:86 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:534 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:565 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 @@ -4459,9 +4459,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:82 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:280 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 @@ -4497,69 +4497,69 @@ msgstr "" msgid "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:484 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:146 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1186 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:149 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1000 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1192 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 msgid "Collections" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:65 msgid "Click to open" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:367 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1198 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1195 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:344 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:157 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:237 msgid "Paste Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 msgid "Copy Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:483 msgid "Double-click to open Book Details window" msgstr "" @@ -4632,7 +4632,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:40 @@ -5537,7 +5537,7 @@ msgid "&Monospaced font family:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:117 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "" @@ -5613,7 +5613,7 @@ msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "&Author(s): " msgstr "" @@ -5627,7 +5627,7 @@ 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:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:535 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:428 msgid "&Publisher: " msgstr "" @@ -5638,13 +5638,13 @@ msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:537 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:430 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:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:544 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:433 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:293 @@ -5653,8 +5653,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:519 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:546 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:434 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:435 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:292 @@ -5881,12 +5881,12 @@ msgid "&Search Regular Expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/search_and_replace.py:71 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:101 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/search_and_replace.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:102 msgid "Invalid regular expression: %s" msgstr "" @@ -6139,7 +6139,7 @@ msgstr "" msgid "TXTZ Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 @@ -6150,7 +6150,7 @@ msgstr "" msgid "TextLabel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 msgid "Use a wizard to help construct the Regular expression" msgstr "" @@ -6230,74 +6230,74 @@ msgstr "" msgid "Cover browser could not be loaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:113 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:294 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:558 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:599 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:622 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:672 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:503 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:216 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:252 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:994 msgid "Undefined" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:629 msgid "star(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:630 msgid "Unrated" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:659 msgid "Set '%s' to today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:661 msgid "Clear '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:289 msgid " index:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:358 msgid "The enumeration \"{0}\" contains an invalid value that will be set to the default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:512 msgid "Apply changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:705 msgid "Remove series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:709 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:708 msgid "Automatically number books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:711 msgid "Force numbers to start with " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:783 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:782 msgid "The enumeration \"{0}\" contains invalid values that will not appear in the list" msgstr "" @@ -6393,7 +6393,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:304 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" @@ -6484,11 +6484,11 @@ msgstr "" msgid "Could not upload the following books to the device, as no suitable formats were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1221 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1229 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1230 msgid "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -6504,7 +6504,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:255 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:61 msgid "Invalid template" @@ -6512,7 +6512,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:256 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:62 msgid "The template %s is invalid:" @@ -6746,7 +6746,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1188 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1185 msgid "Format" msgstr "" @@ -6839,6 +6839,21 @@ msgstr "" msgid "&Move current library to new location" msgstr "" +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_plugin_toolbars.py:23 +msgid "Add \"%s\" to toolbars or menus" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_plugin_toolbars.py:29 +msgid "Select the toolbars and/or menus to add %s to:" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_plugin_toolbars.py:45 +msgid "You can also customise the plugin locations using Preferences -> Customise the toolbar" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:33 msgid "Set defaults for conversion of comics (CBR/CBZ files)" msgstr "" @@ -6923,11 +6938,11 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:995 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:311 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:321 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:575 msgid "Date" msgstr "" @@ -6954,13 +6969,13 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1371 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1379 msgid "Invalid author name" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1372 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1380 msgid "Author names cannot contain & characters." msgstr "" @@ -7144,22 +7159,22 @@ msgid "Working" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:412 msgid "Lower Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:411 msgid "Upper Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:414 msgid "Title Case" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:415 msgid "Capitalize" msgstr "" @@ -7191,156 +7206,164 @@ msgstr "" msgid "Immediately make all changes without closing the dialog. This operation cannot be canceled or undone" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:400 +msgid "Enter an identifier type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:405 msgid "You can destroy your library using this feature. Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.

    Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:413 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See this reference for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:502 msgid "S/R TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:646 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:715 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:723 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:652 +msgid "You must specify a destination identifier type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:756 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:775 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:896 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:757 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:776 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:845 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:897 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:949 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:927 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:979 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:587 msgid "Delete saved search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:980 msgid "The selected saved search/replace will be deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:945 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:953 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1005 msgid "Save search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:946 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:998 msgid "Search/replace name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:954 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1006 msgid "That saved search/replace already exists and will be overwritten. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:524 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:526 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:527 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:528 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:529 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:504 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:530 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:786 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:532 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:426 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:787 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:533 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:534 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:427 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:536 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:512 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:539 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:431 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:432 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:143 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:540 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:541 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:542 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:543 msgid "Remove &all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:547 msgid "If checked, the series will be cleared" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:548 msgid "&Clear series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:549 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -7348,244 +7371,254 @@ 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:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:553 msgid "&Automatically number books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:554 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:557 msgid "&Force numbers to start with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:558 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:440 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:978 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:559 msgid "d MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:566 msgid "&Apply date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:562 msgid "&Published:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:564 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:444 msgid "Clear published date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:567 msgid "Remove &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:568 msgid "" "Force the title to be in title case. If both this and swap authors are checked,\n" "title and author are swapped before the title case is set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:570 msgid "Change title to title &case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:571 msgid "Update title sort based on the current title. This will be applied only after other changes to title." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:572 msgid "Update &title sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:573 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:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:576 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:577 msgid "Change &cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:578 msgid "&Generate default cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:579 msgid "&Remove cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:580 msgid "Set from &ebook file(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:581 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:465 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:526 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:582 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:404 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:583 msgid "Load searc&h/replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:584 msgid "Select saved search/replace to load." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:585 msgid "Save current search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:586 msgid "Sa&ve" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:588 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:64 msgid "Delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:589 msgid "Search &field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:590 msgid "The name of the field that you want to search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:591 msgid "Search &mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:592 msgid "Choose whether to use basic text matching or advanced regular expression matching" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:615 +msgid "Identifier type:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:616 +msgid "Choose which identifier type to operate upon" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:595 msgid "Te&mplate:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:596 msgid "Enter a template to be used as the source for the search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:597 msgid "&Search for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:598 msgid "Enter the what you are looking for, either plain text or a regular expression, depending on the mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:599 msgid "Check this box if the search string must match exactly upper and lower case. Uncheck it if case is to be ignored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:600 msgid "Cas&e sensitive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:573 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:601 msgid "&Replace with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:602 msgid "The replacement text. The matched search text will be replaced with this string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:575 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:603 msgid "&Apply function after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:604 msgid "" "Specify how the text is to be processed after matching and replacement. In character mode, the entire\n" "field is processed. In regular expression mode, only the matched text is processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:606 msgid "&Destination field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:607 msgid "" "The field that the text will be put into after all replacements.\n" "If blank, the source field is used if the field is modifiable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:609 msgid "M&ode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:610 msgid "Specify how the text should be copied into the destination." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:611 msgid "" "Specifies whether result items should be split into multiple values or\n" "left as single values. This option has the most effect when the source field is\n" "not multiple and the destination field is multiple" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:614 msgid "Split &result" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:617 msgid "For multiple-valued fields, sho&w" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:618 msgid "values starting a&t" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:619 msgid "with values separated b&y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:620 msgid "Used when displaying test results to separate values in multiple-valued fields" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:621 msgid "Test text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:622 msgid "Test result" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:623 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:624 msgid "&Search and replace" msgstr "" @@ -7596,18 +7629,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:252 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:262 msgid "Could not read cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:256 msgid "Could not read cover from %s format" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:263 msgid "The cover in the %s format is invalid" msgstr "" @@ -7721,7 +7754,7 @@ msgid " The red color warns that the current title sort does not match the curre msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:472 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:50 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:221 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:384 @@ -7729,13 +7762,13 @@ msgid "Previous" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:475 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:483 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:358 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:366 msgid "Save changes and edit the metadata of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:46 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:103 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:211 @@ -7743,58 +7776,58 @@ msgstr "" msgid "Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:688 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:695 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:913 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:698 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:920 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:781 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:783 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:862 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:784 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:863 msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes. Apply changes?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:819 msgid "Timed out" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:818 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "The download of social metadata timed out, the servers are probably busy. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:825 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:827 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:828 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:862 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:863 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:959 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:310 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:960 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:962 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:311 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -7807,19 +7840,19 @@ msgid "Meta information" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:92 msgid "" "Automatically create the title sort entry based on the current title entry.\n" "Using this button to create title sort will change title sort from red to green." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:114 msgid "Swap the author and title" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:103 msgid "" "Automatically create the author sort entry based on the current author entry.\n" "Using this button to create author sort will change author sort from red to green." @@ -7846,7 +7879,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:121 msgid "Remove unused series (Series that have no books)" msgstr "" @@ -7865,7 +7898,7 @@ msgid "Publishe&d:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:445 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:159 msgid "&Fetch metadata from server" msgstr "" @@ -7928,7 +7961,7 @@ msgid "Update metadata from the metadata in the selected format" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:464 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:585 msgid "&Comments" msgstr "" @@ -7937,21 +7970,21 @@ msgid "Password needed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:172 msgid "&Show password" @@ -8024,200 +8057,231 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:42 +msgid "" +" Download this periodical every week on the specified days after\n" +" the specified time. For example, if you choose: Monday after\n" +" 9:00 AM, then the periodical will be download every Monday as\n" +" soon after 9:00 AM as possible.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:61 +msgid "&Download after:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:91 +msgid "" +" Download this periodical every month, on the specified days.\n" +" The download will happen as soon after the specified time as\n" +" possible on the specified days of each month. For example,\n" +" if you choose the 1st and the 15th after 9:00 AM, the\n" +" periodical will be downloaded on the 1st and 15th of every\n" +" month, as soon after 9:00 AM as possible.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:103 +msgid "&Days of the month:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:105 +msgid "Comma separated list of days of the month. For example: 1, 15" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:109 +msgid "Download &after:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:142 +msgid "" +" Download this periodical every x days. For example, if you\n" +" choose 30 days, the periodical will be downloaded every 30\n" +" days. Note that you can set periods of less than a day, like\n" +" 0.1 days to download a periodical more than once a day.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:151 +msgid "&Download every:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:154 +msgid "every hour" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:157 +msgid "days" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:161 +msgid "Note: You can set intervals of less than a day, by typing the value manually." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:196 msgid "%s news sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:311 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:312 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:346 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:347 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:348 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:365 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:372 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:373 +msgid "never" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:379 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:211 -msgid "Last downloaded" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:393 +msgid "Last downloaded:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:424 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:429 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:534 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:535 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:229 -msgid "Every " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +msgid "Days of week" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 -msgid "day" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +msgid "Days of month" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 -msgid "Monday" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +msgid "Every x days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 -msgid "Tuesday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 -msgid "Wednesday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 -msgid "Thursday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 -msgid "Friday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 -msgid "Saturday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 -msgid "Sunday" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 -msgid "at" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:230 -msgid "Interval at which to download this recipe. A value of zero means that the recipe will be downloaded every hour." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:231 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:253 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 -msgid " days" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "Maximum number of copies (issues) of this recipe to keep. Set to 0 to keep all (disable)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "&Keep at most:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "" "

    When set, this option will cause calibre to keep, at most, the specified number of issues of this periodical. Every time a new issue is downloaded, the oldest one is deleted, if the total is larger than this number.\n" "

    Note that this feature only works if you have the option to add the title as tag checked, above.\n" "

    Also, the setting for deleting periodicals older than a number of days, below, takes priority over this setting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 msgid "all issues" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 msgid " issues" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Delete downloaded news older than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "" "

    Delete downloaded news older than the specified number of days. Set to zero to disable.\n" "

    You can also control the maximum number of issues of a specific periodical that are kept by clicking the Advanced tab for that periodical above." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "never delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:273 +msgid " days" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "Download all scheduled news sources at once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 msgid "Download &all scheduled" msgstr "" @@ -8472,12 +8536,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1319 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1325 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1326 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -8572,118 +8636,122 @@ msgstr "" msgid "

    Explode the ePub to display contents in a file browser window. To tweak individual files, right-click, then 'Open with...' your editor of choice. When tweaks are complete, close the file browser window and the editor windows you used to edit files in the epub.

    Rebuild the ePub, updating your calibre library.

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:141 msgid "No recipe selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:146 msgid "The attached file: %s is a recipe to download %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:147 msgid "Recipe for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:265 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:189 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:193 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:337 msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:243 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:338 msgid "

    Could not create recipe. Error:
    %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:341 msgid "Replace recipe?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:248 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:307 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:342 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:282 msgid "Choose builtin recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:328 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:329 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:369 msgid "You will lose any unsaved changes. To save your changes, click the Add/Update recipe button. Continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:262 +msgid "S&how recipe files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263 msgid "Customize &builtin recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:264 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:266 msgid "" "