diff --git a/Changelog.yaml b/Changelog.yaml index 6b41c53e30..1e3d4905b1 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,175 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.20 + date: 2010-09-24 + + + new features: + - title: "Tweak epub feature." + type: major + description: > + "Now you can conveniently browse the contents of an epub, tweak them and rebuild the epub within your calibre library + by right clicking on the book and selecting Tweak ePub. See http://www.mobileread.com/forums/showthread.php?t=99875 + for details." + + - title: "Add button to Edit metadata dialog to trim borders from the cover" + + - title: "Kobo driver: Add support for setting the ReadStatus to Read and correctly deal with empty collections" + + - title: "Improved algorithm for removal of hyphens during pre-processing" + + - title: "EPUB metadata: Don't read timestamp value from epubs as I am sick of closing bugs about adding books and having the Date not be today." + + - title: "After bulk edit metadata, reselect previously selected books." + + bug fixes: + - title: "Fix regression in 0.7.19 that broke the By Author and By Title category listing in Stanza/Aldiko feeds." + + - title: "MOBI Output: Fix regression that broke sections list in downloaded periodicals on Kindle for non-english news sources" + + - title: "News download: Rationalize cover processing." + tickets: [6852] + + - title: "Cover cache: load images only in the GUI thread to prevent stale files being leftover by set_path due to Windows file locking" + + - title: "Database: Make renaming of folders on case change more robust" + tickets: [6914] + + - title: "When adding/replacing files to/in EPUB files, set the GPF bit for all files in the archive, to prevent unzip from complaining in linux" + tickets: [6363] + + - title: "Plugin loading: Handle encoding declarations in .py files correctly" + + - title: "MOBI input: Another corner case" + tickets: [6909] + + - title: "IPC: Store results file in the calibre temp dir and also dont die if for some reason removing result file fails. Should make adding/saving more robust" + + - title: "Database: Fix regression that caused has_cover to create empty directories unneccessarily" + + - title: "Detection of Alex on unix" + tickets: [5900] + + - title: "News download: Don't add inline table of contents when downloading news for the Kindle" + + - title: "Add prologue and epilogue to default chapter detection regex" + + - title: "Kobo driver: Fix issue where books that are read were getting their status reset to Unread" + + - title: "Device drivers: Fix occassional false positive when matching books on device with books in the calibre library" + + - title: "Content server: Making serving of large files more efficient." + + - title: "GUI device detection: Handle case when user yanks connected device before device connection handler is called." + tickets: [6864] + + - title: "Strip leading/trailing whitespace when setting metadata using the edit metadata dialog" + tickets: [6854] + + - title: "KOBO: Editing the Im_Reading list with SD Card installed fixed" + tickets: [6850] + + new recipes: + - title: "Neal's Nuze and Popular Science" + author: Tony Stegall + + - title: "Rmf24.pl" + author: "Tomasz Dlugosz" + + - title: "Gazeta Pomorska" + author: "Richard" + + - title: "Le Journal de Montreal and superesportes" + author: "Luciano Furtado" + + - title: "The Marker" + author: Marbs + + - title: "Tagesanzeiger" + author: noxxx + + + improved recipes: + - Danas + - Harvard Business Review + +- version: 0.7.19 + date: 2010-09-17 + + new features: + - title: "The ability to perform search and replace via regular expressions in the Bulk Edit metadata dialog" + type: major + + - title: "Add an option to have calibre automatically convert straight quotes to curly quotes. Also handles em/en-dashes and ellipses. Found under 'Look & Feel' in the conversion options" + type: major + tickets: [6808] + + - title: "Greatly improve sorting performance on large libraries." + type: major + + - title: "Drivers for the SONY PRS-350/PRS-650 and the Sovos E-reader" + + - title: "Kobo driver: Add management of the I'm Reading list on Kobo via an Im_Reading tag in calibre. See http://www.mobileread.com/forums/showthread.php?t=98906 for details" + + - title: "Conversion pipeline: Add an option to control how hard line breaks are removed during preprocessing. See the Structure Detection section in the conversion options" + + - title: "In the Edit metadata dialog, indicate whether the author sort value matches the author value, using a background color" + + - title: "Add an option to split the toolbar into two toolbars in Preferences->Interface->Look and Feel" + + - title: "EPUB Output: Improved design of the 'jacket' page created by calibre when using the 'Insert metadata at start of book' option" + + - title: "PDF Input: Improve line unwrapping, handling of hyphens/dashes and quotes. Also handle more specially encoded non ASCII characters" + + bug fixes: + - title: "Fix regression in filename shortening that caused loss of filename extension" + + - title: "Fix various regressions that could be triggered when using search restrictions and/or multi-sorts and connecting a device" + + - title: "Database: Fix possible race condition in windows when changing title/author during move of book files, that could lead to old files not being deleted" + + - title: "Conversion pipeline: Don't die if rescaling of image raises an exception, just ignore and continue" + + - title: "Database: Update has_cover cache when setting/removing covers so that the search returns correct results. Also fix an exception that could occur when adding books with a db that has been upgraded from very old SQL." + + - title: "Workaround for bug that affects some windows installs causing white backgrounds on default covers to be rendered as yellow" + + - title: "Fix handling of non-ASCII chars when rendering series in default EPUB cover" + + - title: "Fix --start-in-tray switch displays hidden windows in metacity, xfwm4 and compiz" + tickets: [6806] + + - title: "Conversion pipeline: When setting margins on explicitly set padding to 0 to override and existing padding in the input document" + + - title: "CHM Input: Ignore missing image files in the input document" + tickets: [6773] + + - title: "News download: Fix bug that could break some downloads in non ASCII locales" + + - title: "TXT Output: When using preserve spaces, output tab characters as a sequence of four non-breaking spaces as some readers dont handle the 09 char code." + + - title: "PDB Input: Fix bug in conversion of TOC in some PML files" + + + new recipes: + - title: "taz.de RSS" + author: Alexander Schremmer + + - title: "Brand Eins" + author: Constantin Hofstetter + + improved recipes: + - Harpers (free) + - Danas + - Novosti + - ESPN + - Taz Digiabo + - Slate + - AJC + - Infobae + - NSPM + - version: 0.7.18 date: 2010-09-10 @@ -197,7 +366,7 @@ new features: - title: "Multiple library support: Various improvements to make using multiple calibre libraries easier." type: major - desc: > + description: > "Now, when you switch libraries using the Choose Library button on the toolbar, entries are created in the menu of that button to easily switch to that library in the future. Also, you can now right click on a book in the calibre library and use the 'Copy to library' action to copy the book to another library, that you have switched to at least once. The name of the current library is shown in the titlebar. @@ -205,7 +374,7 @@ - title: "Content server: Allow setting a restriction so that the server shares only some of the books in the library." type: major - desc: > + description: > "You can now use a Saved Search as a restiction for the content server, via Preferences->Content Server. This will cause the server to share only those books that match the saved search. " diff --git a/imgsrc/rating.svg b/imgsrc/rating.svg new file mode 100644 index 0000000000..d289c71b99 --- /dev/null +++ b/imgsrc/rating.svg @@ -0,0 +1,589 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/imgsrc/trim.svg b/imgsrc/trim.svg new file mode 100644 index 0000000000..8c8810fc66 --- /dev/null +++ b/imgsrc/trim.svg @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index 631fb8b617..9ee61b1866 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -26,7 +26,7 @@ var current_library_request = null; ////////////////////////////// GET BOOK LIST ////////////////////////////// -var LIBRARY_FETCH_TIMEOUT = 30000; // milliseconds +var LIBRARY_FETCH_TIMEOUT = 5*60000; // milliseconds function create_table_headers() { var thead = $('table#book_list thead tr'); @@ -54,7 +54,7 @@ function render_book(book) { formats = book.attr("formats").split(","); if (formats.length > 0) { for (i=0; i < formats.length; i++) { - title += ''+formats[i]+', '; + title += ''+formats[i]+', '; } title = title.slice(0, title.length-2); title += ' ({0} MB) '.format(size); diff --git a/resources/images/news/ajc.png b/resources/images/news/ajc.png new file mode 100644 index 0000000000..110f40e039 Binary files /dev/null and b/resources/images/news/ajc.png differ diff --git a/resources/images/news/boortz.png b/resources/images/news/boortz.png new file mode 100644 index 0000000000..ac806e8056 Binary files /dev/null and b/resources/images/news/boortz.png differ diff --git a/resources/images/news/fronda.png b/resources/images/news/fronda.png new file mode 100644 index 0000000000..c332bbda49 Binary files /dev/null and b/resources/images/news/fronda.png differ diff --git a/resources/images/news/gazeta_pomorska.png b/resources/images/news/gazeta_pomorska.png new file mode 100644 index 0000000000..1d7099d7f3 Binary files /dev/null and b/resources/images/news/gazeta_pomorska.png differ diff --git a/resources/images/news/howtogeek.png b/resources/images/news/howtogeek.png new file mode 100644 index 0000000000..236ac79df6 Binary files /dev/null and b/resources/images/news/howtogeek.png differ diff --git a/resources/images/news/jpost_fr.png b/resources/images/news/jpost_fr.png new file mode 100644 index 0000000000..f68746e2e4 Binary files /dev/null and b/resources/images/news/jpost_fr.png differ diff --git a/resources/images/news/legeartis.png b/resources/images/news/legeartis.png new file mode 100644 index 0000000000..fd9001d9ed Binary files /dev/null and b/resources/images/news/legeartis.png differ diff --git a/resources/images/news/michalkiewicz.png b/resources/images/news/michalkiewicz.png index a87f30f5a3..cfa61c7fd6 100644 Binary files a/resources/images/news/michalkiewicz.png and b/resources/images/news/michalkiewicz.png differ diff --git a/resources/images/news/popscience.png b/resources/images/news/popscience.png new file mode 100644 index 0000000000..ff33483b10 Binary files /dev/null and b/resources/images/news/popscience.png differ diff --git a/resources/images/news/rmf24_ESKN.png b/resources/images/news/rmf24_ESKN.png new file mode 100644 index 0000000000..53ad00078a Binary files /dev/null and b/resources/images/news/rmf24_ESKN.png differ diff --git a/resources/images/news/rmf24_fakty.png b/resources/images/news/rmf24_fakty.png new file mode 100644 index 0000000000..53ad00078a Binary files /dev/null and b/resources/images/news/rmf24_fakty.png differ diff --git a/resources/images/rating.png b/resources/images/rating.png new file mode 100644 index 0000000000..81eba505b9 Binary files /dev/null and b/resources/images/rating.png differ diff --git a/resources/images/star.png b/resources/images/star.png deleted file mode 100644 index 6eb1fb890f..0000000000 Binary files a/resources/images/star.png and /dev/null differ diff --git a/resources/images/trim.png b/resources/images/trim.png new file mode 100644 index 0000000000..3cb93adfa6 Binary files /dev/null and b/resources/images/trim.png differ diff --git a/resources/jacket/stylesheet.css b/resources/jacket/stylesheet.css new file mode 100644 index 0000000000..8dee8edc3c --- /dev/null +++ b/resources/jacket/stylesheet.css @@ -0,0 +1,116 @@ +/* +** Book Jacket generation +** +** The template for Book Jackets is template.xhtml +** This CSS is inserted into the generated HTML at conversion time +** +** Users can control parts of the presentation of a generated book jacket by +** editing this file and template.xhtml +** +** The general form of a generated Book Jacket: +** +** Title +** Series: series [series_index] +** Published: year_of_publication +** Rating: #_of_stars +** Tags: tag1, tag2, tag3 ... +** +** Comments +** +** If a book does not have Series information, a date of publication, a rating or tags +** the corresponding row is automatically removed from the generated book jacket. +*/ + +/* +** Banner +** Only affects EPUB, kindle ignores this type of formatting +*/ +.cbj_banner { + background: #eee; + border: thin solid black; + margin: 1em; + padding: 1em; + -webkit-border-radius:8px; + } + +/* +** Title +*/ +.cbj_title { + font-size: x-large; + text-align: center; + } + +/* +** Table containing Series, Publication Year, Rating and Tags +*/ +table.cbj_header { + width: 100%; + } + +/* +** General formatting for banner labels +*/ +table.cbj_header td.cbj_label { + font-family: sans-serif; + font-weight: bold; + text-align: right; + width: 40%; + } + +/* +** General formatting for banner content +*/ +table.cbj_header td.cbj_content { + font-family: sans-serif; + text-align: left; + width:60%; + } + +/* +** To skip a banner item (Series|Published|Rating|Tags), +** edit the appropriate CSS rule below. +*/ +table.cbj_header tr.cbj_series { + /* Uncomment the next line to remove 'Series' from banner section */ + /* display:none; */ + } + +table.cbj_header tr.cbj_pubdate { + /* Uncomment the next line to remove 'Published' from banner section */ + /* display:none; */ + } + +table.cbj_header tr.cbj_rating { + /* Uncomment the next line to remove 'Rating' from banner section */ + /* display:none; */ + } + +table.cbj_header tr.cbj_tags { + /* Uncomment the next line to remove 'Tags' from banner section */ + /* display:none; */ + } + +hr { + /* This rule controls formatting for any hr elements contained in the jacket */ + border-top: 0px solid white; + border-right: 0px solid white; + border-bottom: 2px solid black; + border-left: 0px solid white; + margin-left: 10%; + width: 80%; + } + +.cbj_footer { + font-family: sans-serif; + font-size: small; + margin-top: 8px; + text-align: center; + } +.cbj_smallcaps { + font-size: 90%; + } + +.cbj_comments { + font-family: sans-serif; + } diff --git a/resources/jacket/template.xhtml b/resources/jacket/template.xhtml new file mode 100644 index 0000000000..93e12983e8 --- /dev/null +++ b/resources/jacket/template.xhtml @@ -0,0 +1,34 @@ + + + {title_str} + + + + +
+
{title}
+ + + + + + + + + + + + + + + + + +
{series_label}:{series}
{pubdate_label}:{pubdate}
{rating_label}:{rating}
{tags_label}:{tags}
+ +
+
+
{comments}
+ + + diff --git a/resources/recipes/adventuregamers.recipe b/resources/recipes/adventuregamers.recipe index 1cde045953..d08eca1723 100644 --- a/resources/recipes/adventuregamers.recipe +++ b/resources/recipes/adventuregamers.recipe @@ -1,7 +1,5 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' +__copyright__ = '2009-2010, Darko Miletic ' ''' www.adventuregamers.com ''' @@ -10,14 +8,11 @@ from calibre.web.feeds.news import BasicNewsRecipe class AdventureGamers(BasicNewsRecipe): title = u'Adventure Gamers' - language = 'en' - + language = 'en' __author__ = 'Darko Miletic' - description = 'Adventure games portal' + description = 'Adventure games portal' publisher = 'Adventure Gamers' - category = 'news, games, adventure, technology' - language = 'en' - + category = 'news, games, adventure, technology' oldest_article = 10 delay = 10 max_articles_per_feed = 100 @@ -26,14 +21,25 @@ class AdventureGamers(BasicNewsRecipe): remove_javascript = True use_embedded_content = False INDEX = u'http://www.adventuregamers.com' - - html2lrf_options = [ - '--comment', description - , '--category', category - , '--publisher', publisher - ] - - html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' + extra_css = """ + .pageheader_type{font-size: x-large; font-weight: bold; color: #828D74} + .pageheader_title{font-size: xx-large; color: #394128} + .pageheader_byline{font-size: small; font-weight: bold; color: #394128} + .score_bg {display: inline; width: 100%; margin-bottom: 2em} + .score_column_1{ padding-left: 10px; font-size: small; width: 50%} + .score_column_2{ padding-left: 10px; font-size: small; width: 50%} + .score_column_3{ padding-left: 10px; font-size: small; width: 50%} + .score_header{font-size: large; color: #50544A} + .bodytext{display: block} + body{font-family: Helvetica,Arial,sans-serif} + """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } keep_only_tags = [ dict(name='div', attrs={'class':'content_middle'}) @@ -43,14 +49,15 @@ class AdventureGamers(BasicNewsRecipe): dict(name=['object','link','embed','form']) ,dict(name='div', attrs={'class':['related-stories','article_leadout','prev','next','both']}) ] - + remove_tags_after = [dict(name='div', attrs={'class':'toolbar_fat'})] - + remove_attributes = ['width','height'] + feeds = [(u'Articles', u'http://feeds2.feedburner.com/AdventureGamers')] - + def get_article_url(self, article): return article.get('guid', None) - + def append_page(self, soup, appendtag, position): pager = soup.find('div',attrs={'class':'toolbar_fat_next'}) if pager: @@ -59,19 +66,19 @@ class AdventureGamers(BasicNewsRecipe): texttag = soup2.find('div', attrs={'class':'bodytext'}) for it in texttag.findAll(style=True): del it['style'] - newpos = len(texttag.contents) + newpos = len(texttag.contents) self.append_page(soup2,texttag,newpos) texttag.extract() appendtag.insert(position,texttag) - - + + def preprocess_html(self, soup): - mtag = '\n' - soup.head.insert(0,mtag) for item in soup.findAll(style=True): del item['style'] + for item in soup.findAll('div', attrs={'class':'floatright'}): + item.extract() self.append_page(soup, soup.body, 3) pager = soup.find('div',attrs={'class':'toolbar_fat'}) if pager: - pager.extract() - return soup + pager.extract() + return self.adeify_images(soup) diff --git a/resources/recipes/ajc.recipe b/resources/recipes/ajc.recipe index 4315101a63..82809f626c 100644 --- a/resources/recipes/ajc.recipe +++ b/resources/recipes/ajc.recipe @@ -10,12 +10,31 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): oldest_article = 1 max_articles_per_feed = 100 no_stylesheets = True - extra_css = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt }' + masthead_url = 'http://gawand.org/wp-content/uploads/2010/06/ajc-logo.gif' + 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;} + p{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':['cxArticleContent']}) - ,dict(attrs={'id':['cxArticleText','cxArticleBodyText']}) + dict(name='div', attrs={'class':['cxArticleHeader']}) + ,dict(attrs={'id':['cxArticleText']}) ] + + + remove_tags = [ + dict(name='div' , attrs={'class':'cxArticleList' }) + ,dict(name='div' , attrs={'class':'cxFeedTease' }) + ,dict(name='div' , attrs={'class':'cxElementEnlarge' }) + ,dict(name='div' , attrs={'id':'cxArticleTools' }) + ] + + + feeds = [ ('Breaking News', 'http://www.ajc.com/genericList-rss.do?source=61499'), # ------------------------------------------------------------------- @@ -23,7 +42,7 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): # read by simply removing the pound sign from it. I currently have it # set to only get the Cobb area # -------------------------------------------------------------------- - ('Atlanta & Fulton', 'http://www.ajc.com/section-rss.do?source=atlanta'), + #('Atlanta & Fulton', 'http://www.ajc.com/section-rss.do?source=atlanta'), #('Clayton', 'http://www.ajc.com/section-rss.do?source=clayton'), #('DeKalb', 'http://www.ajc.com/section-rss.do?source=dekalb'), #('Gwinnett', 'http://www.ajc.com/section-rss.do?source=gwinnett'), @@ -41,7 +60,7 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): # but again # You can enable which ever team you like by removing the pound sign # ------------------------------------------------------------------------ - ('Sports News', 'http://www.ajc.com/genericList-rss.do?source=61510'), + #('Sports News', 'http://www.ajc.com/genericList-rss.do?source=61510'), #('Braves', 'http://www.ajc.com/genericList-rss.do?source=61457'), ('Falcons', 'http://www.ajc.com/genericList-rss.do?source=61458'), #('Hawks', 'http://www.ajc.com/genericList-rss.do?source=61522'), @@ -52,11 +71,16 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): ('Music', 'http://www.accessatlanta.com/section-rss.do?source=music'), ] + def postprocess_html(self, soup, first): + for credit_tag in soup.findAll('span', attrs={'class':['imageCredit rightFloat']}): + credit_tag.name ='p' + + return soup + + #def print_version(self, url): + # return url.partition('?')[0] +'?printArticle=y' - - def print_version(self, url): - return url.partition('?')[0] +'?printArticle=y' diff --git a/resources/recipes/boortz.recipe b/resources/recipes/boortz.recipe new file mode 100644 index 0000000000..0b52e0b9ca --- /dev/null +++ b/resources/recipes/boortz.recipe @@ -0,0 +1,44 @@ +from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup, re +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'Nealz Nuze' + language = 'en' + __author__ = 'TonytheBookworm' + description = 'Neal Boortz Show Radio Notes' + publisher = 'Neal Boortz' + category = 'news, politics, USA, talkshow' + oldest_article = 2 + max_articles_per_feed = 100 + linearize_tables = True + no_stylesheets = True + remove_javascript = True + + masthead_url = 'http://boortz.com/images/nuze_logo.gif' + keep_only_tags = [ + dict(name='td', attrs={'id':['contentWellCell']}) + + ] + remove_tags = [ + dict(name='a', attrs={'class':['blogPermalink']}), + dict(name='span', attrs={'class':['blogBylineSeparator']}), + dict(name='td', attrs={'id':['nealztitle']}), + ] + remove_tags_after = [dict(name='div', attrs={'class':'blogEntryBody'}),] + feeds = [ + ('NUZE', 'http://boortz.com/nealz_nuze_rss/rss.xml') + + ] + + + + + + + + + + + + + + diff --git a/resources/recipes/brand_eins.recipe b/resources/recipes/brand_eins.recipe new file mode 100644 index 0000000000..be5b98ffe6 --- /dev/null +++ b/resources/recipes/brand_eins.recipe @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +__license__ = 'GPL v3' +__copyright__ = '2010, Constantin Hofstetter ' +__version__ = '0.95' + +''' http://brandeins.de - Wirtschaftsmagazin ''' +import re +import string +from calibre.web.feeds.recipes import BasicNewsRecipe + +class BrandEins(BasicNewsRecipe): + + title = u'Brand Eins' + __author__ = 'Constantin Hofstetter' + description = u'Wirtschaftsmagazin' + publisher ='brandeins.de' + category = 'politics, business, wirtschaft, Germany' + use_embedded_content = False + lang = 'de-DE' + no_stylesheets = True + encoding = 'utf-8' + language = 'de' + + # 2 is the last full magazine (default) + # 1 is the newest (but not full) + # 3 is one before 2 etc. + which_ausgabe = 2 + + keep_only_tags = [dict(name='div', attrs={'id':'theContent'}), dict(name='div', attrs={'id':'sidebar'}), dict(name='div', attrs={'class':'intro'}), dict(name='p', attrs={'class':'bodytext'}), dict(name='div', attrs={'class':'single_image'})] + + ''' + brandeins.de + ''' + + def postprocess_html(self, soup,first): + + # Move the image of the sidebar right below the h3 + first_h3 = soup.find(name='div', attrs={'id':'theContent'}).find('h3') + for imgdiv in soup.findAll(name='div', attrs={'class':'single_image'}): + if len(first_h3.findNextSiblings('div', {'class':'intro'})) >= 1: + # first_h3.parent.insert(2, imgdiv) + first_h3.findNextSiblings('div', {'class':'intro'})[0].parent.insert(4, imgdiv) + else: + first_h3.parent.insert(2, imgdiv) + + # Now, remove the sidebar + soup.find(name='div', attrs={'id':'sidebar'}).extract() + + # Remove the rating-image (stars) from the h3 + for img in first_h3.findAll(name='img'): + img.extract() + + # Mark the intro texts as italic + for div in soup.findAll(name='div', attrs={'class':'intro'}): + for p in div.findAll('p'): + content = self.tag_to_string(p) + new_p = "

"+ content +"

" + p.replaceWith(new_p) + + return soup + + def parse_index(self): + feeds = [] + + archive = "http://www.brandeins.de/archiv.html" + + soup = self.index_to_soup(archive) + latest_jahrgang = soup.findAll('div', attrs={'class': re.compile(r'\bjahrgang-latest\b') })[0].findAll('ul')[0] + pre_latest_issue = latest_jahrgang.findAll('a')[len(latest_jahrgang.findAll('a'))-self.which_ausgabe] + url = pre_latest_issue.get('href', False) + # Get the title for the magazin - build it out of the title of the cover - take the issue and year; + self.title = "Brand Eins "+ re.search(r"(?P\d\d\/\d\d\d\d+)", pre_latest_issue.find('img').get('title', False)).group('date') + url = 'http://brandeins.de/'+url + + # url = "http://www.brandeins.de/archiv/magazin/tierisch.html" + titles_and_articles = self.brand_eins_parse_latest_issue(url) + if titles_and_articles: + for title, articles in titles_and_articles: + feeds.append((title, articles)) + return feeds + + def brand_eins_parse_latest_issue(self, url): + soup = self.index_to_soup(url) + article_lists = [soup.find('div', attrs={'class':'subColumnLeft articleList'}), soup.find('div', attrs={'class':'subColumnRight articleList'})] + + titles_and_articles = [] + current_articles = [] + chapter_title = "Editorial" + self.log('Found Chapter:', chapter_title) + + # Remove last list of links (thats just the impressum and the 'gewinnspiel') + article_lists[1].findAll('ul')[len(article_lists[1].findAll('ul'))-1].extract() + + for article_list in article_lists: + for chapter in article_list.findAll('ul'): + if len(chapter.findPreviousSiblings('h3')) >= 1: + new_chapter_title = string.capwords(self.tag_to_string(chapter.findPreviousSiblings('h3')[0])) + if new_chapter_title != chapter_title: + titles_and_articles.append([chapter_title, current_articles]) + current_articles = [] + self.log('Found Chapter:', new_chapter_title) + chapter_title = new_chapter_title + for li in chapter.findAll('li'): + a = li.find('a', href = True) + if a is None: + continue + title = self.tag_to_string(a) + url = a.get('href', False) + if not url or not title: + continue + url = 'http://brandeins.de/'+url + if len(a.parent.findNextSiblings('p')) >= 1: + description = self.tag_to_string(a.parent.findNextSiblings('p')[0]) + else: + description = '' + + self.log('\t\tFound article:', title) + self.log('\t\t\t', url) + self.log('\t\t\t', description) + + current_articles.append({'title': title, 'url': url, 'description': description, 'date':''}) + titles_and_articles.append([chapter_title, current_articles]) + return titles_and_articles diff --git a/resources/recipes/danas.recipe b/resources/recipes/danas.recipe index 159553370a..38957b3d63 100644 --- a/resources/recipes/danas.recipe +++ b/resources/recipes/danas.recipe @@ -20,16 +20,27 @@ class Danas(BasicNewsRecipe): encoding = 'utf-8' masthead_url = 'http://www.danas.rs/images/basic/danas.gif' language = 'sr' + remove_javascript = True publication_type = 'newspaper' remove_empty_feeds = True extra_css = """ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} - .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; - margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} - .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; - font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} """ + .antrfileText{border-left: 2px solid #999999; + margin-left: 0.8em; + padding-left: 1.2em; + margin-bottom: 0; + margin-top: 0} + h2,.datum,.lokacija,.autor{font-size: small} + .antrfileNaslov{border-left: 2px solid #999999; + margin-left: 0.8em; + padding-left: 1.2em; + font-weight:bold; + margin-bottom: 0; + margin-top: 0} + img{margin-bottom: 0.8em} + """ conversion_options = { 'comment' : description @@ -38,14 +49,25 @@ class Danas(BasicNewsRecipe): , 'language' : language } - preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + preprocess_regexps = [ + (re.compile(u'\u0110'), lambda match: u'\u00D0') + ,(re.compile(u'\u2018'), lambda match: '‘') # left single quotation mark + ,(re.compile(u'\u2019'), lambda match: '’') # right single quotation mark + ,(re.compile(u'\u201a'), lambda match: '‘') # single low-9 quotation mark + ,(re.compile(u'\u201b'), lambda match: '’') # single high-reversed-9 quotation mark + ,(re.compile(u'\u201c'), lambda match: '“') # left double quotation mark + ,(re.compile(u'\u201d'), lambda match: '”') # right double quotation mark + ,(re.compile(u'\u201e'), lambda match: '“') # double low-9 quotation mark + ,(re.compile(u'\u201f'), lambda match: '”') # double high-reversed-9 quotation mark + ] keep_only_tags = [dict(name='div', attrs={'id':'left'})] remove_tags = [ dict(name='div', attrs={'class':['width_1_4','metaClanka','baner']}) ,dict(name='div', attrs={'id':'comments'}) - ,dict(name=['object','link','iframe']) + ,dict(name=['object','link','iframe','meta']) ] + remove_attributes = ['w:st','st'] feeds = [ (u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27') @@ -74,12 +96,23 @@ class Danas(BasicNewsRecipe): ,(u'Vostani Serbie' , u'http://www.danas.rs/rss/rss.asp?column_id=57') ,(u'Med&Jad-a' , u'http://www.danas.rs/rss/rss.asp?column_id=58') ,(u'Svetlosti pozornice' , u'http://www.danas.rs/rss/rss.asp?column_id=59') + ,(u'Dva cvancika' , u'http://www.danas.rs/rss/rss.asp?column_id=65') + ,(u'Iz kornera' , u'http://www.danas.rs/rss/rss.asp?column_id=64') ] def preprocess_html(self, soup): + for tagn in ['st1:place','st1:city','st1:country-region','st1:state']: + for item in soup.body.findAll(tagn): + item.name='span' for item in soup.findAll(style=True): del item['style'] - return self.adeify_images(soup) + for item in soup.findAll('a'): + if item.has_key('name'): + item.extract() + for item in soup.findAll('img'): + if not item.has_key('alt'): + item['alt'] = 'image' + return soup def print_version(self, url): return url + '&action=print' diff --git a/resources/recipes/espn.recipe b/resources/recipes/espn.recipe index 5d75c3977b..178dbf27a8 100644 --- a/resources/recipes/espn.recipe +++ b/resources/recipes/espn.recipe @@ -8,6 +8,7 @@ espn.com ''' import re from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ptempfile import TemporaryFile class ESPN(BasicNewsRecipe): @@ -78,12 +79,19 @@ class ESPN(BasicNewsRecipe): def get_browser(self): br = BasicNewsRecipe.get_browser() br.set_handle_refresh(False) - if self.username is not None and self.password is not None: - br.open('http://espn.com')#('http://espn.go.com/#myespn') - br.select_form(nr=1) - br.form.find_control(name='username', type='text').value = self.username - br.form['password'] = self.password - br.submit() + url = ('https://r.espn.go.com/members/v3_1/login') + raw = br.open(url).read() + raw = re.sub(r'(?s)
.*?id="regsigninbtn".*?
', '', raw) + with TemporaryFile(suffix='.htm') as fname: + with open(fname, 'wb') as f: + f.write(raw) + br.open_local_file(fname) + + br.form = br.forms().next() + br.form.find_control(name='username', type='text').value = self.username + br.form['password'] = self.password + br.submit().read() + br.open('http://espn.go.com').read() br.set_handle_refresh(True) return br diff --git a/resources/recipes/gazeta_pomorska.recipe b/resources/recipes/gazeta_pomorska.recipe new file mode 100644 index 0000000000..083f5cbeed --- /dev/null +++ b/resources/recipes/gazeta_pomorska.recipe @@ -0,0 +1,104 @@ +#!/usr/bin/env python + +# # Przed uzyciem przeczytaj komentarz w sekcji "feeds" + +__license__ = 'GPL v3' +__copyright__ = u'2010, Richard z forum.eksiazki.org' +'''pomorska.pl''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class GazetaPomorska(BasicNewsRecipe): + title = u'Gazeta Pomorska' + publisher = u'Gazeta Pomorska' + description = u'Kujawy i Pomorze - wiadomo\u015bci' + language = 'pl' + __author__ = u'Richard z forum.eksiazki.org' + # # (dziekuje t3d z forum.eksiazki.org za testy) + oldest_article = 2 + max_articles_per_feed = 20 + no_stylesheets = True + remove_javascript = True + preprocess_regexps = [ + (re.compile(r'' +''' +rmf24.pl +''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class RMF24_ESKN(BasicNewsRecipe): + title = u'Rmf24.pl - Ekonomia Sport Kultura Nauka' + description = u'Ekonomia, sport, kultura i nauka ze strony rmf24.pl' + language = 'pl' + oldest_article = 7 + max_articles_per_feed = 100 + __author__ = u'Tomasz D\u0142ugosz' + no_stylesheets = True + remove_javascript = True + + feeds = [(u'Ekonomia', u'http://www.rmf24.pl/ekonomia/feed'), + (u'Sport', u'http://www.rmf24.pl/sport/feed'), + (u'Kultura', u'http://www.rmf24.pl/kultura/feed'), + (u'Nauka', u'http://www.rmf24.pl/nauka/feed')] + + keep_only_tags = [dict(name='div', attrs={'class':'box articleSingle print'})] + + remove_tags = [ + dict(name='div', attrs={'class':'toTop'}), + dict(name='div', attrs={'class':'category'}), + dict(name='div', attrs={'class':'REMOVE'}), + dict(name='div', attrs={'class':'embed embedAd'})] + + extra_css = ''' + h1 { font-size: 1.2em; } + ''' + + preprocess_regexps = [ + (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in + [ + (r'

Zdj.cie

', lambda match: ''), + (r'embed embed(Left|Right|Center) articleEmbed(Audio|Wideo articleEmbedVideo|ArticleFull|ArticleTitle|ArticleListTitle|AlbumHorizontal)">', lambda match: 'REMOVE">'), + (r'
', lambda match: 'REMOVE">'), + (r'', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'If your institution has site license access, enter.*here.', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'to subscribe to our.*;.*\}', re.DOTALL|re.IGNORECASE), lambda match: ''), - (re.compile(r'\)\(jQuery\);.*-->', re.DOTALL|re.IGNORECASE), lambda match: ''), - ] + extra_css = ''' + p{font-weight: normal; font-size:small} + li{font-weight: normal; font-size:small} + .headline p{font-size:x-small; font-family:Arial,Helvetica,sans-serif;} + h2{font-size:large; font-family:Arial,Helvetica,sans-serif;} + h3{font-size:x-small;font-family:Arial,Helvetica,sans-serif;} + ''' diff --git a/resources/recipes/slate.recipe b/resources/recipes/slate.recipe index c03255d2df..f2a5b71e3c 100644 --- a/resources/recipes/slate.recipe +++ b/resources/recipes/slate.recipe @@ -1,7 +1,8 @@ #!/usr/bin/env python +__copyright__ = '2008, Kovid Goyal ' __license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' + ''' calibre recipe for slate.com ''' @@ -10,13 +11,12 @@ import re from calibre.web.feeds.recipes import BasicNewsRecipe from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, CData, Comment, Tag -class PeriodicalNameHere(BasicNewsRecipe): +class Slate(BasicNewsRecipe): # Method variables for customizing downloads - title = 'Slate' description = 'A general-interest publication offering analysis and commentary about politics, news and culture.' - __author__ = 'GRiker and Sujata Raman' - max_articles_per_feed = 20 - oldest_article = 7.0 + __author__ = 'GRiker, Sujata Raman and Nick Redding' + max_articles_per_feed = 100 + oldest_article = 14 recursions = 0 delay = 0 simultaneous_downloads = 5 @@ -27,8 +27,11 @@ class PeriodicalNameHere(BasicNewsRecipe): encoding = None language = 'en' - - + slate_complete = True + if slate_complete: + title = 'Slate (complete)' + else: + title = 'Slate (weekly)' # Method variables for customizing feed parsing summary_length = 250 @@ -50,8 +53,10 @@ class PeriodicalNameHere(BasicNewsRecipe): # The second entry is for 'Big Money', which comes from a different site, uses different markup remove_tags = [dict(attrs={ 'id':['toolbox','recommend_tab','insider_ad_wrapper', - 'article_bottom_tools_cntr','fray_article_discussion', 'fray_article_links','bottom_sponsored_links','author_bio', - 'bizbox_links_bottom','ris_links_wrapper','BOXXLE']}), + 'article_bottom_tools_cntr','fray_article_discussion','fray_article_links','bottom_sponsored_links','author_bio', + 'bizbox_links_bottom','ris_links_wrapper','BOXXLE', + 'comments_button','add_comments_button','comments-to-fray','marriott_ad', + 'article_bottom_tools','recommend_tab2','fbog_article_bottom_cntr']}), dict(attrs={ 'id':['content-top','service-links-bottom','hed']}) ] excludedDescriptionKeywords = ['Slate V','Twitter feed','podcast'] @@ -62,16 +67,15 @@ class PeriodicalNameHere(BasicNewsRecipe): extra_css = ''' .h1_subhead{font-family:Arial; font-size:small; } h1{font-family:Verdana; font-size:large; } - .byline {font-family:Georgia; margin-bottom: 0px; color: #660033;} - .dateline {font-family:Arial; font-size: smaller; height: 0pt; color:#666666;} + .byline {font-family:Georgia; margin-bottom: 0px; } + .dateline {font-family:Arial; font-size: smaller; height: 0pt;} .imagewrapper {font-family:Verdana;font-size:x-small; } .source {font-family:Verdana; font-size:x-small;} .credit {font-family:Verdana; font-size: smaller;} #article_body {font-family:Verdana; } #content {font-family:Arial; } .caption{font-family:Verdana;font-style:italic; font-size:x-small;} - h3{font-family:Arial; color:#666666; font-size:small} - a{color:#0066CC;} + h3{font-family:Arial; font-size:small} ''' # Local variables to extend class @@ -89,32 +93,59 @@ class PeriodicalNameHere(BasicNewsRecipe): if isinstance(item, (NavigableString, CData)): strings.append(item.string) elif isinstance(item, Tag): - res = self.tag_to_string(item) + res = self.tag_to_string(item,use_alt=False) if res: strings.append(res) return strings - - def extract_sections(self): + def extract_named_sections(self): soup = self.index_to_soup( self.baseURL ) - soup_top_stories = soup.find(True, attrs={'class':'tap2_topic entry-content'}) + soup_nav_bar = soup.find(True, attrs={'id':'nav'}) + briefing_nav = soup.find('li') + briefing_url = briefing_nav.a['href'] + for section_nav in soup_nav_bar.findAll('li'): + section_name = self.tag_to_string(section_nav,use_alt=False) + self.section_dates.append(section_name) + + soup = self.index_to_soup(briefing_url) + + self.log("Briefing url = %s " % briefing_url) + section_lists = soup.findAll('ul','view_links_list') + + sections = [] + for section in section_lists : + sections.append(section) + return sections + + + def extract_dated_sections(self): + soup = self.index_to_soup( self.baseURL ) + soup_top_stories = soup.find(True, attrs={'id':'tap3_cntr'}) + if soup_top_stories: + self.section_dates.append("Top Stories") + self.log("SELECTION TOP STORIES %s" % "Top Stories") + soup = soup.find(True, attrs={'id':'toc_links_container'}) todays_section = soup.find(True, attrs={'class':'todaydateline'}) self.section_dates.append(self.tag_to_string(todays_section,use_alt=False)) + self.log("SELECTION DATE %s" % self.tag_to_string(todays_section,use_alt=False)) older_section_dates = soup.findAll(True, attrs={'class':'maindateline'}) for older_section in older_section_dates : self.section_dates.append(self.tag_to_string(older_section,use_alt=False)) + self.log("SELECTION DATE %s" % self.tag_to_string(older_section,use_alt=False)) if soup_top_stories: - headline_stories = soup_top_stories.find('ul') + headline_stories = soup_top_stories + self.log("HAVE top_stories") else: headline_stories = None + self.log("NO top_stories") section_lists = soup.findAll('ul') # Prepend the headlines to the first section if headline_stories: - section_lists[0].insert(0,headline_stories) + section_lists.insert(0,headline_stories) sections = [] for section in section_lists : @@ -123,9 +154,8 @@ class PeriodicalNameHere(BasicNewsRecipe): def extract_section_articles(self, sections_html) : - # Find the containers with section content - soup = self.index_to_soup(str(sections_html)) - sections = soup.findAll('ul') + # Find the containers with section content + sections = sections_html articles = {} key = None @@ -135,10 +165,25 @@ class PeriodicalNameHere(BasicNewsRecipe): # Get the section name if section.has_key('id') : + self.log("PROCESSING SECTION id = %s" % section['id']) key = self.section_dates[i] + if key.startswith("Pod"): + continue + if key.startswith("Blog"): + continue + articles[key] = [] + ans.append(key) + elif self.slate_complete: + key = self.section_dates[i] + if key.startswith("Pod"): + continue + if key.startswith("Blog"): + continue + self.log("PROCESSING SECTION name = %s" % key) articles[key] = [] ans.append(key) else : + self.log("SECTION %d HAS NO id" % i); continue # Get the section article_list @@ -149,8 +194,10 @@ class PeriodicalNameHere(BasicNewsRecipe): bylines = self.tag_to_strings(article) url = article.a['href'] title = bylines[0] - full_title = self.tag_to_string(article) - + full_title = self.tag_to_string(article,use_alt=False) + #self.log("ARTICLE TITLE%s" % title) + #self.log("ARTICLE FULL_TITLE%s" % full_title) + #self.log("URL %s" % url) author = None description = None pubdate = None @@ -181,7 +228,7 @@ class PeriodicalNameHere(BasicNewsRecipe): excluded = re.compile('|'.join(self.excludedDescriptionKeywords)) found_excluded = excluded.search(description) if found_excluded : - if self.verbose : self.log(" >>> skipping %s (description keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) + self.log(" >>> skipping %s (description keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) continue # Skip articles whose title contain excluded keywords @@ -190,7 +237,7 @@ class PeriodicalNameHere(BasicNewsRecipe): #self.log("evaluating full_title: %s" % full_title) found_excluded = excluded.search(full_title) if found_excluded : - if self.verbose : self.log(" >>> skipping %s (title keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) + self.log(" >>> skipping %s (title keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) continue # Skip articles whose author contain excluded keywords @@ -198,7 +245,7 @@ class PeriodicalNameHere(BasicNewsRecipe): excluded = re.compile('|'.join(self.excludedAuthorKeywords)) found_excluded = excluded.search(author) if found_excluded : - if self.verbose : self.log(" >>> skipping %s (author keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) + self.log(" >>> skipping %s (author keyword exclusion: %s) <<<\n" % (title, found_excluded.group(0))) continue skip_this_article = False @@ -206,6 +253,7 @@ class PeriodicalNameHere(BasicNewsRecipe): for article in articles[key] : if article['url'] == url : skip_this_article = True + self.log("SKIPPING DUP %s" % url) break if skip_this_article : @@ -217,6 +265,8 @@ class PeriodicalNameHere(BasicNewsRecipe): articles[feed] = [] articles[feed].append(dict(title=title, url=url, date=pubdate, description=description, author=author, content='')) + #self.log("KEY %s" % feed) + #self.log("APPENDED %s" % url) # Promote 'newspapers' to top for (i,article) in enumerate(articles[feed]) : if article['description'] is not None : @@ -225,32 +275,6 @@ class PeriodicalNameHere(BasicNewsRecipe): ans = [(key, articles[key]) for key in ans if articles.has_key(key)] - ans = self.remove_duplicates(ans) - return ans - - def flatten_document(self, ans): - flat_articles = [] - for (i,section) in enumerate(ans) : - #self.log("flattening section %s: " % section[0]) - for article in section[1] : - #self.log("moving %s to flat_articles[]" % article['title']) - flat_articles.append(article) - flat_section = ['All Articles', flat_articles] - flat_ans = [flat_section] - return flat_ans - - def remove_duplicates(self, ans): - # Return a stripped ans - for (i,section) in enumerate(ans) : - #self.log("section %s: " % section[0]) - for article in section[1] : - #self.log("\t%s" % article['title']) - #self.log("\looking for %s" % article['url']) - for (j,subsequent_section) in enumerate(ans[i+1:]) : - for (k,subsequent_article) in enumerate(subsequent_section[1]) : - if article['url'] == subsequent_article['url'] : - #self.log( "removing %s (%s) from %s" % (subsequent_article['title'], subsequent_article['url'], subsequent_section[0]) ) - del subsequent_section[1][k] return ans def print_version(self, url) : @@ -258,13 +282,22 @@ class PeriodicalNameHere(BasicNewsRecipe): # Class methods def parse_index(self) : - sections = self.extract_sections() + if self.slate_complete: + sections = self.extract_named_sections() + else: + sections = self.extract_dated_sections() section_list = self.extract_section_articles(sections) - section_list = self.flatten_document(section_list) return section_list - def get_browser(self) : - return BasicNewsRecipe.get_browser() + def get_masthead_url(self): + masthead = 'http://img.slate.com/images/redesign2008/slate_logo.gif' + br = BasicNewsRecipe.get_browser() + try: + br.open(masthead) + except: + self.log("\nMasthead unavailable") + masthead = None + return masthead def stripAnchors(self,soup): body = soup.find('div',attrs={'id':['article_body','content']}) @@ -294,8 +327,8 @@ class PeriodicalNameHere(BasicNewsRecipe): excluded = re.compile('|'.join(self.excludedContentKeywords)) found_excluded = excluded.search(str(soup)) if found_excluded : - print "no allowed content found, removing article" - raise Exception('String error') + print "No allowed content found, removing article" + raise Exception('Rejected article') # Articles from www.thebigmoney.com use different tagging for byline, dateline and body head = soup.find('head') @@ -328,7 +361,6 @@ class PeriodicalNameHere(BasicNewsRecipe): dept_kicker = soup.find('div', attrs={'class':'department_kicker'}) if dept_kicker is not None : kicker_strings = self.tag_to_strings(dept_kicker) - #kicker = kicker_strings[2] + kicker_strings[3] kicker = ''.join(kicker_strings[2:]) kicker = re.sub('\.','',kicker) h3Tag = Tag(soup, "h3") @@ -336,25 +368,11 @@ class PeriodicalNameHere(BasicNewsRecipe): emTag.insert(0,NavigableString(kicker)) h3Tag.insert(0, emTag) dept_kicker.replaceWith(h3Tag) + else: + self.log("No kicker--return null") + return None - # Change

to

- headline = soup.find("h1") - tag = headline.find("span") - tag.name = 'div' - - if headline is not None : - h2tag = Tag(soup, "h2") - h2tag['class'] = "headline" - strs = self.tag_to_strings(headline) - result = '' - for (i,substr) in enumerate(strs) : - result += substr - if i < len(strs) -1 : - result += '
' - #h2tag.insert(0, result) - #headline.replaceWith(h2tag) - - # Fix up the concatenated byline and dateline + # Fix up the concatenated byline and dateline byline = soup.find(True,attrs={'class':'byline'}) if byline is not None : bylineTag = Tag(soup,'div') diff --git a/resources/recipes/superesportes.recipe b/resources/recipes/superesportes.recipe new file mode 100644 index 0000000000..49289f188d --- /dev/null +++ b/resources/recipes/superesportes.recipe @@ -0,0 +1,79 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Luciano Furtado ' +''' +www.superesportes.com.br +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class SuperEsportesRecipe(BasicNewsRecipe): + + title = u'www.superesportes.com.br' + description = u'Superesportes - Not√≠cias do esporte no Brasil e no mundo' + __author__ = 'Luciano Furtado' + language = 'pt' + category = 'esportes, Brasil' + no_stylesheets = True + oldest_article = 7 + + use_embedded_content=0 + max_articles_per_feed = 10 + cover_url = 'http://imgs.mg.superesportes.com.br/superesportes_logo.png' + + extra_css = 'div.info_noticias h1 { font-size: 100% }' + + + + remove_tags = [ + dict(name='div',attrs={'class':'topo'}), + dict(name='div',attrs={'class':'rodape'}), + dict(name='div',attrs={'class':'navegacao'}), + dict(name='div',attrs={'class':'lateral2'}), + dict(name='div',attrs={'class':'leia_mais'}), + dict(name='div',attrs={'id':'comentar'}), + dict(name='div',attrs={'id':'vrumelc_noticia'}), + dict(name='div',attrs={'class':'compartilhe'}), + dict(name='div',attrs={'class':'linha_noticias'}), + dict(name='div',attrs={'class':'botoes_noticias'}), + dict(name='div',attrs={'class':'barra_time bg_time'}), + ] + + + + def parse_index(self): + feeds = [] + sections = [ + (u'Atletico', 'http://www.df.superesportes.com.br/futebol/atletico-mg/capa_atletico_mg/index.shtml'), + (u'Botafogo', 'http://www.df.superesportes.com.br/futebol/botafogo/capa_botafogo/index.shtml'), + (u'Corinthinas', 'http://www.df.superesportes.com.br/futebol/corinthians/capa_corinthians/index.shtml'), + (u'Cruzeiro', 'http://www.df.superesportes.com.br/futebol/cruzeiro/capa_cruzeiro/index.shtml'), + (u'Flamengo', 'http://www.df.superesportes.com.br/futebol/flamengo/capa_flamengo/index.shtml'), + (u'Fluminense', 'http://www.df.superesportes.com.br/futebol/fluminense/capa_fluminense/index.shtml'), + (u'Palmeiras', 'http://www.df.superesportes.com.br/futebol/palmeiras/capa_palmeiras/index.shtml'), + (u'Santos', 'http://www.df.superesportes.com.br/futebol/santos/capa_santos/index.shtml'), + (u'S√£o Paulo', 'http://www.df.superesportes.com.br/futebol/sao-paulo/capa_sao_paulo/index.shtml'), + (u'Vasco', 'http://www.df.superesportes.com.br/futebol/vasco/capa_vasco/index.shtml'), + ] + + + for section, url in sections: + current_articles = [] + + soup = self.index_to_soup(url) + latestNews = soup.find(name='ul',attrs={'class': 'lista_ultimas_noticias'}) + + for li_tag in latestNews.findAll(name='li'): + a_tag = li_tag.find('a', href= True) + if a_tag is None: + continue + title = self.tag_to_string(a_tag) + url = a_tag.get('href', False) + self.log("\n\nFound title: " + title + "\nUrl: " + url + "\nSection: " + section) + current_articles.append({'title': title, 'url': url, 'description': title, 'date':''}) + + if current_articles: + feeds.append((section, current_articles)) + + + return feeds + diff --git a/resources/recipes/tagesan.recipe b/resources/recipes/tagesan.recipe new file mode 100644 index 0000000000..8514162598 --- /dev/null +++ b/resources/recipes/tagesan.recipe @@ -0,0 +1,45 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1284927619(BasicNewsRecipe): + title = u'Tagesanzeiger' + publisher = u'Tamedia AG' + oldest_article = 2 + __author__ = 'noxxx' + max_articles_per_feed = 100 + description = 'tagesanzeiger.ch: Nichts verpassen' + category = 'News, Politik, Nachrichten, Schweiz, Zürich' + language = 'de' + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + remove_tags = [ + dict(name='img') + ,dict(name='div',attrs={'class':['swissquote ad','boxNews','centerAD','contentTabs2','sbsLabel']}) + ,dict(name='div',attrs={'id':['colRightAd','singleRight','singleSmallRight','MailInfo','metaLine','sidebarSky','contentFooter','commentInfo','commentInfo2','commentInfo3','footerBottom','clear','boxExclusiv','singleLogo','navSearch','headerLogin','headerBottomRight','horizontalNavigation','subnavigation','googleAdSense','footerAd','contentbox','articleGalleryNav']}) + ,dict(name='form',attrs={'id':['articleMailForm','commentform']}) + ,dict(name='div',attrs={'style':['position:absolute']}) + ,dict(name='script',attrs={'type':['text/javascript']}) + ,dict(name='p',attrs={'class':['schreiben','smallPrint','charCounter','caption']}) + ] + feeds = [ + (u'Front', u'http://www.tagesanzeiger.ch/rss.html') + ,(u'Zürich', u'http://www.tagesanzeiger.ch/zuerich/rss.html') + ,(u'Schweiz', u'http://www.tagesanzeiger.ch/schweiz/rss.html') + ,(u'Ausland', u'http://www.tagesanzeiger.ch/ausland/rss.html') + ,(u'Digital', u'http://www.tagesanzeiger.ch/digital/rss.html') + ,(u'Wissen', u'http://www.tagesanzeiger.ch/wissen/rss.html') + ,(u'Panorama', u'http://www.tagesanzeiger.ch/panorama/rss.html') + ,(u'Wirtschaft', u'http://www.tagesanzeiger.ch/wirtschaft/rss.html') + ,(u'Sport', u'http://www.tagesanzeiger.ch/sport/rss.html') + ,(u'Kultur', u'http://www.tagesanzeiger.ch/kultur/rss.html') + ,(u'Leben', u'http://www.tagesanzeiger.ch/leben/rss.html') + ,(u'Auto', u'http://www.tagesanzeiger.ch/auto/rss.html')] + + def print_version(self, url): + return url + '/print.html' + diff --git a/resources/recipes/taz.recipe b/resources/recipes/taz.recipe index 45b414f3cd..93ce5fded0 100644 --- a/resources/recipes/taz.recipe +++ b/resources/recipes/taz.recipe @@ -8,8 +8,9 @@ __docformat__ = 'restructuredtext de' ''' www.taz.de/digiabo ''' -import os, urllib2, zipfile, tempfile +import os, urllib2, zipfile from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ptempfile import PersistentTemporaryFile class TazDigiabo(BasicNewsRecipe): @@ -26,38 +27,39 @@ class TazDigiabo(BasicNewsRecipe): } def build_index(self): - if self.username is not None and self.password is not None: - domain = "http://www.taz.de" + domain = "http://www.taz.de" - url = domain + "/epub/" + url = domain + "/epub/" - auth_handler = urllib2.HTTPBasicAuthHandler() - auth_handler.add_password(realm='TAZ-ABO', - uri=url, - user=self.username, - passwd=self.password) - opener = urllib2.build_opener(auth_handler) - urllib2.install_opener(opener) + auth_handler = urllib2.HTTPBasicAuthHandler() + auth_handler.add_password(realm='TAZ-ABO', + uri=url, + user=self.username, + passwd=self.password) + opener = urllib2.build_opener(auth_handler) + urllib2.install_opener(opener) - try: - f = urllib2.urlopen(url) - except urllib2.HTTPError: - self.report_progress(0,_('Can\'t login to download issue')) - raise ValueError('Failed to login, check your username and' - ' password') + try: + f = urllib2.urlopen(url) + except urllib2.HTTPError: + self.report_progress(0,_('Can\'t login to download issue')) + raise ValueError('Failed to login, check your username and' + ' password') - tmp = tempfile.TemporaryFile() - self.report_progress(0,_('downloading epub')) - tmp.write(f.read()) + tmp = PersistentTemporaryFile(suffix='.epub') + self.report_progress(0,_('downloading epub')) + tmp.write(f.read()) + tmp.close() - zfile = zipfile.ZipFile(tmp, 'r') - self.report_progress(0,_('extracting epub')) + zfile = zipfile.ZipFile(tmp.name, 'r') + self.report_progress(0,_('extracting epub')) - zfile.extractall(self.output_dir) + zfile.extractall(self.output_dir) - tmp.close() - index = os.path.join(self.output_dir, 'content.opf') + tmp.close() + index = os.path.join(self.output_dir, 'content.opf') - self.report_progress(1,_('epub downloaded and extracted')) + self.report_progress(1,_('epub downloaded and extracted')) + + return index - return index diff --git a/resources/recipes/taz_rss.recipe b/resources/recipes/taz_rss.recipe new file mode 100644 index 0000000000..143bd26791 --- /dev/null +++ b/resources/recipes/taz_rss.recipe @@ -0,0 +1,24 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Alexander Schremmer ' + +from calibre.web.feeds.news import BasicNewsRecipe + +class TazRSSRecipe(BasicNewsRecipe): + title = u'Taz.de (die tageszeitung) RSS Feed - German' + __author__ = 'Alexander Schremmer' + language = 'de' + lang = 'de-DE' + oldest_article = 7 + max_articles_per_feed = 100 + publisher = 'taz Entwicklungs GmbH & Co. Medien KG' + + conversion_options = {'publisher': publisher, + 'language': lang, + } + + feeds = [(u'TAZ main feed', u'http://www.taz.de/rss.xml')] + keep_only_tags = [dict(name='div', attrs={'class': 'sect sect_article'})] + remove_tags_after = dict(name='div', attrs={'class': 'rack'}) + remove_tags = [dict(name=['div'], attrs={'class': 'rack'}), + dict(name=['div'], attrs={'class': 'artikelwerbung'}), + dict(name=['ul'], attrs={'class': 'toolbar'}),] diff --git a/resources/recipes/the_marker.recipe b/resources/recipes/the_marker.recipe new file mode 100644 index 0000000000..e5f1ffc761 --- /dev/null +++ b/resources/recipes/the_marker.recipe @@ -0,0 +1,52 @@ +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1283848012(BasicNewsRecipe): + description = 'TheMarker Financial News in Hebrew' + __author__ = 'TonyTheBookworm, Marbs' + cover_url = 'http://static.ispot.co.il/wp-content/upload/2009/09/themarker.jpg' + title = u'TheMarker' + language = 'he' + simultaneous_downloads = 5 + remove_javascript = True + timefmt = '[%a, %d %b, %Y]' + oldest_article = 1 + remove_tags = [dict(name='tr', attrs={'bgcolor':['#738A94']}) ] + max_articles_per_feed = 10 + extra_css='body{direction: rtl;} .article_description{direction: rtl; } a.article{direction: rtl; } .calibre_feed_description{direction: rtl; }' + feeds = [(u'Head Lines', u'http://www.themarker.com/tmc/content/xml/rss/hpfeed.xml'), + (u'TA Market', u'http://www.themarker.com/tmc/content/xml/rss/sections/marketfeed.xml'), + (u'Real Estate', u'http://www.themarker.com/tmc/content/xml/rss/sections/realEstaterfeed.xml'), + (u'Wall Street & Global', u'http://www.themarker.com/tmc/content/xml/rss/sections/wallsfeed.xml'), + (u'Law', u'http://www.themarker.com/tmc/content/xml/rss/sections/lawfeed.xml'), + (u'Media', u'http://www.themarker.com/tmc/content/xml/rss/sections/mediafeed.xml'), + (u'Consumer', u'http://www.themarker.com/tmc/content/xml/rss/sections/consumerfeed.xml'), + (u'Career', u'http://www.themarker.com/tmc/content/xml/rss/sections/careerfeed.xml'), + (u'Car', u'http://www.themarker.com/tmc/content/xml/rss/sections/carfeed.xml'), + (u'High Tech', u'http://www.themarker.com/tmc/content/xml/rss/sections/hightechfeed.xml'), + (u'Investor Guide', u'http://www.themarker.com/tmc/content/xml/rss/sections/investorGuidefeed.xml')] + + def print_version(self, url): + split1 = url.split("=") + weblinks = url + + if weblinks is not None: + for link in weblinks: + #--------------------------------------------------------- + #here we need some help with some regexpressions + #we are trying to find it.themarker.com in a url + #----------------------------------------------------------- + re1='.*?' # Non-greedy match on filler + re2='(it\\.themarker\\.com)' # Fully Qualified Domain Name 1 + rg = re.compile(re1+re2,re.IGNORECASE|re.DOTALL) + m = rg.search(url) + + + if m: + split2 = url.split("article/") + print_url = 'http://it.themarker.com/tmit/PrintArticle/' + split2[1] + + else: + print_url = 'http://www.themarker.com/ibo/misc/printFriendly.jhtml?ElementId=%2Fibo%2Frepositories%2Fstories%2Fm1_2000%2F' + split1[1]+'.xml' + + return print_url diff --git a/resources/recipes/wsj.recipe b/resources/recipes/wsj.recipe index fd5e977d10..88e07bcea3 100644 --- a/resources/recipes/wsj.recipe +++ b/resources/recipes/wsj.recipe @@ -70,13 +70,16 @@ class WallStreetJournal(BasicNewsRecipe): def wsj_add_feed(self,feeds,title,url): self.log('Found section:', title) - if url.endswith('whatsnews'): - articles = self.wsj_find_wn_articles(url) - else: - articles = self.wsj_find_articles(url) + try: + if url.endswith('whatsnews'): + articles = self.wsj_find_wn_articles(url) + else: + articles = self.wsj_find_articles(url) + except: + articles = [] if articles: feeds.append((title, articles)) - return feeds + return feeds def parse_index(self): soup = self.wsj_get_index() @@ -99,7 +102,7 @@ class WallStreetJournal(BasicNewsRecipe): url = 'http://online.wsj.com' + a['href'] feeds = self.wsj_add_feed(feeds,title,url) title = 'What''s News' - url = url.replace('pageone','whatsnews') + url = url.replace('pageone','whatsnews') feeds = self.wsj_add_feed(feeds,title,url) else: title = self.tag_to_string(a) @@ -141,7 +144,7 @@ class WallStreetJournal(BasicNewsRecipe): articles = [] flavorarea = soup.find('div', attrs={'class':lambda x: x and 'ahed' in x}) - if flavorarea is not None: + if flavorarea is not None: flavorstory = flavorarea.find('a', href=lambda x: x and x.startswith('/article')) if flavorstory is not None: flavorstory['class'] = 'mjLinkItem' diff --git a/resources/recipes/wsj_free.recipe b/resources/recipes/wsj_free.recipe index 7f3664f1c4..df8234e8e2 100644 --- a/resources/recipes/wsj_free.recipe +++ b/resources/recipes/wsj_free.recipe @@ -54,10 +54,13 @@ class WallStreetJournal(BasicNewsRecipe): def wsj_add_feed(self,feeds,title,url): self.log('Found section:', title) - if url.endswith('whatsnews'): - articles = self.wsj_find_wn_articles(url) - else: - articles = self.wsj_find_articles(url) + try: + if url.endswith('whatsnews'): + articles = self.wsj_find_wn_articles(url) + else: + articles = self.wsj_find_articles(url) + except: + articles = [] if articles: feeds.append((title, articles)) return feeds diff --git a/resources/recipes/xkcd.recipe b/resources/recipes/xkcd.recipe index 312027004e..ad0d420deb 100644 --- a/resources/recipes/xkcd.recipe +++ b/resources/recipes/xkcd.recipe @@ -24,18 +24,18 @@ class XkcdCom(BasicNewsRecipe): (re.compile(r'()'), lambda m: '%s%s

%s

' % (m.group(1), m.group(3), m.group(2))) ] - + def parse_index(self): INDEX = 'http://xkcd.com/archive/' - soup = self.index_to_soup(INDEX) + soup = self.index_to_soup(INDEX) articles = [] for item in soup.findAll('a', title=True): articles.append({ 'date': item['title'], 'timestamp': time.mktime(time.strptime(item['title'], '%Y-%m-%d'))+1, 'url': 'http://xkcd.com' + item['href'], - 'title': self.tag_to_string(item).encode('UTF-8'), + 'title': self.tag_to_string(item), 'description': '', 'content': '', }) diff --git a/setup/translations.py b/setup/translations.py index 37b92848d9..7f81abf8f5 100644 --- a/setup/translations.py +++ b/setup/translations.py @@ -197,7 +197,7 @@ class GetTranslations(Translations): class ISO639(Command): description = 'Compile translations for ISO 639 codes' - XML = '/usr/lib/python2.6/site-packages/pycountry/databases/iso639.xml' + XML = '/usr/lib/python2.7/site-packages/pycountry/databases/iso639.xml' def run(self, opts): src = self.XML diff --git a/src/calibre/constants.py b/src/calibre/constants.py index c72265b1fa..bb82d6a3c1 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.18' +__version__ = '0.7.20' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 4c87236e71..ec9f7e2bc2 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -459,7 +459,7 @@ from calibre.devices.iriver.driver import IRIVER_STORY from calibre.devices.binatone.driver import README from calibre.devices.hanvon.driver import N516, EB511, ALEX, AZBOOKA, THEBOOK from calibre.devices.edge.driver import EDGE -from calibre.devices.teclast.driver import TECLAST_K3, NEWSMY, IPAPYRUS +from calibre.devices.teclast.driver import TECLAST_K3, NEWSMY, IPAPYRUS, SOVOS from calibre.devices.sne.driver import SNE from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN, GEMEI from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG @@ -557,6 +557,7 @@ plugins += [ TECLAST_K3, NEWSMY, IPAPYRUS, + SOVOS, EDGE, SNE, ALEX, @@ -665,13 +666,17 @@ class ActionCopyToLibrary(InterfaceActionBase): name = 'Copy To Library' actual_plugin = 'calibre.gui2.actions.copy_to_library:CopyToLibraryAction' +class ActionTweakEpub(InterfaceActionBase): + name = 'Tweak ePub' + actual_plugin = 'calibre.gui2.actions.tweak_epub:TweakEpubAction' + plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionConvert, ActionDelete, ActionEditMetadata, ActionView, ActionFetchNews, ActionSaveToDisk, ActionShowBookDetails, ActionRestart, ActionOpenFolder, ActionConnectShare, ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks, ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary, - ActionCopyToLibrary] + ActionCopyToLibrary, ActionTweakEpub] # }}} diff --git a/src/calibre/customize/conversion.py b/src/calibre/customize/conversion.py index 72c067747d..8c8ce8c686 100644 --- a/src/calibre/customize/conversion.py +++ b/src/calibre/customize/conversion.py @@ -155,7 +155,7 @@ class InputFormatPlugin(Plugin): ''' raise NotImplementedError() - def preprocess_html(self, html): + def preprocess_html(self, opts, html): ''' This method is called by the conversion pipeline on all HTML before it is parsed. It is meant to be used to do any required preprocessing on diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 1563f764ca..2b5eb5011e 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -248,6 +248,9 @@ class OutputProfile(Plugin): #: If True, the date is appended to the title of downloaded news periodical_date_in_title = True + #: The character used to represent a star in ratings + ratings_char = u'*' + @classmethod def tags_to_string(cls, tags): return escape(', '.join(tags)) @@ -273,6 +276,7 @@ class iPadOutput(OutputProfile): 'macros': {'border-width': '{length}|medium|thick|thin'} } ] + ratings_char = u'\u2605' touchscreen = True # touchscreen_news_css {{{ touchscreen_news_css = u''' @@ -553,10 +557,11 @@ class KindleOutput(OutputProfile): fsizes = [12, 12, 14, 16, 18, 20, 22, 24] supports_mobi_indexing = True periodical_date_in_title = False + ratings_char = u'\u2605' @classmethod def tags_to_string(cls, tags): - return u'%s
%s' % (', '.join(tags), + return u'%s
%s' % (', '.join(tags), 'ttt '.join(tags)+'ttt ') class KindleDXOutput(OutputProfile): diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 265b42bad2..231cc0e225 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -67,10 +67,17 @@ def load_plugin(path_to_zip_file): # {{{ if name.lower().endswith('plugin.py'): locals = {} raw = zf.read(name) - match = re.search(r'coding[:=]\s*([-\w.]+)', raw[:300]) - encoding = 'utf-8' - if match is not None: - encoding = match.group(1) + lines, encoding = raw.splitlines(), 'utf-8' + cr = re.compile(r'coding[:=]\s*([-\w.]+)') + raw = [] + for l in lines[:2]: + match = cr.search(l) + if match is not None: + encoding = match.group(1) + else: + raw.append(l) + raw += lines[2:] + raw = '\n'.join(raw) raw = raw.decode(encoding) raw = re.sub('\r\n', '\n', raw) exec raw in locals diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 7a451112c0..dd08c745b1 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -29,10 +29,12 @@ class ANDROID(USBMS): # Sony Ericsson 0xfce : { 0xd12e : [0x0100]}, - 0x18d1 : { 0x4e11 : [0x0100, 0x226], 0x4e12: [0x0100, 0x226]}, + # Google + 0x18d1 : { 0x4e11 : [0x0100, 0x226, 0x227], 0x4e12: [0x0100, 0x226, + 0x227]}, # Samsung - 0x04e8 : { 0x681d : [0x0222, 0x0400], + 0x04e8 : { 0x681d : [0x0222, 0x0224, 0x0400], 0x681c : [0x0222, 0x0224, 0x0400], 0x6640 : [0x0100], }, diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index e318d368ff..0946bd2f51 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -207,8 +207,8 @@ class ITUNES(DriverBase): for (j,p_book) in enumerate(self.update_list): if False: if isosx: - self.log.info(" looking for %s" % - str(p_book['lib_book'])[-9:]) + self.log.info(" looking for '%s' by %s uuid:%s" % + (p_book['title'],p_book['author'], p_book['uuid'])) elif iswindows: self.log.info(" looking for '%s' by %s (%s)" % (p_book['title'],p_book['author'], p_book['uuid'])) @@ -303,7 +303,7 @@ class ITUNES(DriverBase): this_book.device_collections = [] this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None this_book.size = book.size() - this_book.uuid = book.album() + this_book.uuid = book.composer() # Hack to discover if we're running in GUI environment if self.report_progress is not None: this_book.thumbnail = self._generate_thumbnail(this_book.path, book) @@ -732,7 +732,7 @@ class ITUNES(DriverBase): for path in paths: if DEBUG: self._dump_cached_book(self.cached_books[path], indent=2) - self.log.info(" looking for '%s' by '%s' (%s)" % + self.log.info(" looking for '%s' by '%s' uuid:%s" % (self.cached_books[path]['title'], self.cached_books[path]['author'], self.cached_books[path]['uuid'])) @@ -740,7 +740,7 @@ class ITUNES(DriverBase): # Purge the booklist, self.cached_books, thumb cache for i,bl_book in enumerate(booklists[0]): if False: - self.log.info(" evaluating '%s' by '%s' (%s)" % + self.log.info(" evaluating '%s' by '%s' uuid:%s" % (bl_book.title, bl_book.author,bl_book.uuid)) found = False @@ -781,10 +781,10 @@ class ITUNES(DriverBase): zf.close() break -# else: -# if DEBUG: -# self.log.error(" unable to find '%s' by '%s' (%s)" % -# (bl_book.title, bl_book.author,bl_book.uuid)) + else: + if DEBUG: + self.log.error(" unable to find '%s' by '%s' (%s)" % + (bl_book.title, bl_book.author,bl_book.uuid)) if False: self._dump_booklist(booklists[0], indent = 2) @@ -905,7 +905,8 @@ class ITUNES(DriverBase): # Add new_book to self.cached_books if DEBUG: - self.log.info(" adding '%s' by '%s' ['%s'] to self.cached_books" % + self.log.info("ITUNES.upload_books()") + self.log.info(" adding '%s' by '%s' uuid:%s to self.cached_books" % ( metadata[i].title, metadata[i].author, metadata[i].uuid)) self.cached_books[this_book.path] = { 'author': metadata[i].author, @@ -943,7 +944,11 @@ class ITUNES(DriverBase): new_booklist.append(this_book) self._update_iTunes_metadata(metadata[i], db_added, lb_added, this_book) - # Add new_book to self.cached_paths + # Add new_book to self.cached_books + if DEBUG: + self.log.info("ITUNES.upload_books()") + self.log.info(" adding '%s' by '%s' uuid:%s to self.cached_books" % + ( metadata[i].title, metadata[i].author, metadata[i].uuid)) self.cached_books[this_book.path] = { 'author': metadata[i].author[0], 'dev_book': db_added, @@ -1406,8 +1411,8 @@ class ITUNES(DriverBase): for book in booklist: if isosx: - self.log.info("%s%-40.40s %-30.30s %-10.10s" % - (' '*indent,book.title, book.author, str(book.library_id)[-9:])) + self.log.info("%s%-40.40s %-30.30s %-10.10s %s" % + (' '*indent,book.title, book.author, str(book.library_id)[-9:], book.uuid)) elif iswindows: self.log.info("%s%-40.40s %-30.30s" % (' '*indent,book.title, book.author)) @@ -1547,11 +1552,12 @@ class ITUNES(DriverBase): if isosx: for ub in self.update_list: - self.log.info("%s%-40.40s %-30.30s %-10.10s" % + self.log.info("%s%-40.40s %-30.30s %-10.10s %s" % (' '*indent, ub['title'], ub['author'], - str(ub['lib_book'])[-9:])) + str(ub['lib_book'])[-9:], + ub['uuid'])) elif iswindows: for ub in self.update_list: self.log.info("%s%-40.40s %-30.30s" % @@ -2342,8 +2348,10 @@ class ITUNES(DriverBase): if isosx: if DEBUG: self.log.info(" deleting '%s' from iDevice" % cached_book['title']) - cached_book['dev_book'].delete() - + try: + cached_book['dev_book'].delete() + except: + self.log.error(" error deleting '%s'" % cached_book['title']) elif iswindows: hit = self._find_device_book(cached_book) if hit: @@ -2802,7 +2810,7 @@ class ITUNES_ASYNC(ITUNES): #this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None this_book.library_id = library_books[book] this_book.size = library_books[book].size() - this_book.uuid = library_books[book].album() + this_book.uuid = library_books[book].composer() # Hack to discover if we're running in GUI environment if self.report_progress is not None: this_book.thumbnail = self._generate_thumbnail(this_book.path, library_books[book]) @@ -2842,6 +2850,7 @@ class ITUNES_ASYNC(ITUNES): this_book.device_collections = [] this_book.library_id = library_books[book] this_book.size = library_books[book].Size + this_book.uuid = library_books[book].Composer # Hack to discover if we're running in GUI environment if self.report_progress is not None: this_book.thumbnail = self._generate_thumbnail(this_book.path, library_books[book]) diff --git a/src/calibre/devices/hanvon/driver.py b/src/calibre/devices/hanvon/driver.py index 75728a94ea..6291864b86 100644 --- a/src/calibre/devices/hanvon/driver.py +++ b/src/calibre/devices/hanvon/driver.py @@ -11,6 +11,10 @@ import re from calibre.devices.usbms.driver import USBMS +def is_alex(device_info): + return device_info[3] == u'Linux 2.6.28 with pxa3xx_u2d' and \ + device_info[4] == u'Seleucia Disk' + class N516(USBMS): name = 'N516 driver' @@ -34,6 +38,9 @@ class N516(USBMS): EBOOK_DIR_MAIN = 'e_book' SUPPORTS_SUB_DIRS = True + def can_handle(self, device_info, debug=False): + return not is_alex(device_info) + class THEBOOK(N516): name = 'The Book driver' gui_name = 'The Book' @@ -61,6 +68,9 @@ class ALEX(N516): EBOOK_DIR_MAIN = 'eBooks' SUPPORTS_SUB_DIRS = True + def can_handle(self, device_info, debug=False): + return is_alex(device_info) + class AZBOOKA(ALEX): name = 'Azbooka driver' @@ -74,6 +84,9 @@ class AZBOOKA(ALEX): EBOOK_DIR_MAIN = '' + def can_handle(self, device_info, debug=False): + return not is_alex(device_info) + class EB511(USBMS): name = 'Elonex EB 511 driver' diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index 496162d668..f19f4fbc07 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -41,6 +41,10 @@ class Book(MetaInformation): self.authors = [''] else: self.authors = [authors] + + if not title: + self.title = _('Unknown') + self.mime = mime self.size = size # will be set later if None diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index f24e00143b..104553b675 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -5,15 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2010, Timothy Legge and Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os +import os, time import sqlite3 as sqlite from calibre.devices.usbms.books import BookList from calibre.devices.kobo.books import Book from calibre.devices.kobo.books import ImageWrapper from calibre.devices.mime import mime_type_ext -from calibre.devices.usbms.driver import USBMS +from calibre.devices.usbms.driver import USBMS, debug_print from calibre import prints +from calibre.devices.usbms.books import CollectionsBookList class KOBO(USBMS): @@ -21,12 +22,15 @@ class KOBO(USBMS): gui_name = 'Kobo Reader' description = _('Communicate with the Kobo Reader') author = 'Timothy Legge and Kovid Goyal' - version = (1, 0, 4) + version = (1, 0, 6) supported_platforms = ['windows', 'osx', 'linux'] + booklist_class = CollectionsBookList + # Ordered list of supported formats FORMATS = ['epub', 'pdf'] + CAN_SET_METADATA = True VENDOR_ID = [0x2237] PRODUCT_ID = [0x4161] @@ -40,6 +44,12 @@ class KOBO(USBMS): VIRTUAL_BOOK_EXTENSIONS = frozenset(['kobo']) + EXTRA_CUSTOMIZATION_MESSAGE = _('The Kobo supports only one collection ' + 'currently: the \"Im_Reading\" list. Create a tag called \"Im_Reading\" ')+\ + 'for automatic management' + + EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(['tags']) + def initialize(self): USBMS.initialize(self) self.book_class = Book @@ -63,6 +73,8 @@ class KOBO(USBMS): self._card_b_prefix if oncard == 'cardb' \ else self._main_prefix + self.booklist_class.rebuild_collections = self.rebuild_collections + # get the metadata cache bl = self.booklist_class(oncard, prefix, self.settings) need_sync = self.parse_metadata_cache(bl, prefix, self.METADATA_CACHE) @@ -85,9 +97,9 @@ class KOBO(USBMS): playlist_map = {} if readstatus == 1: - if lpath not in playlist_map: - playlist_map[lpath] = [] - playlist_map[lpath].append("I\'m Reading") + playlist_map[lpath]= "Im_Reading" + elif readstatus == 2: + playlist_map[lpath]= "Read" path = self.normalize_path(path) # print "Normalized FileName: " + path @@ -104,14 +116,17 @@ class KOBO(USBMS): if self.update_metadata_item(bl[idx]): # print 'update_metadata_item returned true' changed = True - bl[idx].device_collections = playlist_map.get(lpath, []) + if lpath in playlist_map and \ + playlist_map[lpath] not in bl[idx].device_collections: + bl[idx].device_collections.append(playlist_map[lpath]) else: if ContentType == '6': book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID, size=1048576) else: book = self.book_from_path(prefix, lpath, title, authors, mime, date, ContentType, ImageID) # print 'Update booklist' - book.device_collections = playlist_map.get(book.lpath, []) + book.device_collections = [playlist_map[lpath]] if lpath in playlist_map else [] + if bl.add_book(book, replace_metadata=False): changed = True except: # Probably a path encoding error @@ -398,3 +413,163 @@ class KOBO(USBMS): size = os.stat(cls.normalize_path(os.path.join(prefix, lpath))).st_size book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID, size=size, other=mi) return book + + def get_device_paths(self): + paths, prefixes = {}, {} + for prefix, path, source_id in [ + ('main', 'metadata.calibre', 0), + ('card_a', 'metadata.calibre', 1), + ('card_b', 'metadata.calibre', 2) + ]: + prefix = getattr(self, '_%s_prefix'%prefix) + if prefix is not None and os.path.exists(prefix): + paths[source_id] = os.path.join(prefix, *(path.split('/'))) + return paths + + def update_device_database_collections(self, booklists, collections_attributes, oncard): +# debug_print('Starting update_device_database_collections', collections_attributes) + + # Force collections_attributes to be 'tags' as no other is currently supported +# debug_print('KOBO: overriding the provided collections_attributes:', collections_attributes) + collections_attributes = ['tags'] + + collections = booklists.get_collections(collections_attributes) +# debug_print('Collections', collections) + + # Create a connection to the sqlite database + # Needs to be outside books collection as in the case of removing + # the last book from the collection the list of books is empty + # and the removal of the last book would not occur + connection = sqlite.connect(self._main_prefix + '.kobo/KoboReader.sqlite') + cursor = connection.cursor() + + + if collections: + # Process any collections that exist + for category, books in collections.items(): + if category == 'Im_Reading': + # Reset Im_Reading list in the database + if oncard == 'carda': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID like \'file:///mnt/sd/%\'' + elif oncard != 'carda' and oncard != 'cardb': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID not like \'file:///mnt/sd/%\'' + + try: + cursor.execute (query) + except: + debug_print('Database Exception: Unable to reset Im_Reading list') + raise + else: +# debug_print('Commit: Reset Im_Reading list') + connection.commit() + + for book in books: +# debug_print('Title:', book.title, 'lpath:', book.path) + book.device_collections = ['Im_Reading'] + + extension = os.path.splitext(book.path)[1] + ContentType = self.get_content_type_from_extension(extension) + + ContentID = self.contentid_from_path(book.path, ContentType) + datelastread = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) + + t = (datelastread,ContentID,) + + try: + cursor.execute('update content set ReadStatus=1,FirstTimeReading=\'false\',DateLastRead=? where BookID is Null and ContentID = ?', t) + except: + debug_print('Database Exception: Unable create Im_Reading list') + raise + else: + connection.commit() + # debug_print('Database: Commit create Im_Reading list') + if category == 'Read': + # Reset Im_Reading list in the database + if oncard == 'carda': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID like \'file:///mnt/sd/%\'' + elif oncard != 'carda' and oncard != 'cardb': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID not like \'file:///mnt/sd/%\'' + + try: + cursor.execute (query) + except: + debug_print('Database Exception: Unable to reset Im_Reading list') + raise + else: +# debug_print('Commit: Reset Im_Reading list') + connection.commit() + + for book in books: +# debug_print('Title:', book.title, 'lpath:', book.path) + book.device_collections = ['Read'] + + extension = os.path.splitext(book.path)[1] + ContentType = self.get_content_type_from_extension(extension) + + ContentID = self.contentid_from_path(book.path, ContentType) +# datelastread = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) + + t = (ContentID,) + + try: + cursor.execute('update content set ReadStatus=2,FirstTimeReading=\'true\' where BookID is Null and ContentID = ?', t) + except: + debug_print('Database Exception: Unable set book as Rinished') + raise + else: + connection.commit() +# debug_print('Database: Commit set ReadStatus as Finished') + else: # No collections + # Since no collections exist the ReadStatus needs to be reset to 0 (Unread) + print "Reseting ReadStatus to 0" + # Reset Im_Reading list in the database + if oncard == 'carda': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID like \'file:///mnt/sd/%\'' + elif oncard != 'carda' and oncard != 'cardb': + query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID not like \'file:///mnt/sd/%\'' + + try: + cursor.execute (query) + except: + debug_print('Database Exception: Unable to reset Im_Reading list') + raise + else: +# debug_print('Commit: Reset Im_Reading list') + connection.commit() + + cursor.close() + connection.close() + +# debug_print('Finished update_device_database_collections', collections_attributes) + + def sync_booklists(self, booklists, end_session=True): +# debug_print('KOBO: started sync_booklists') + paths = self.get_device_paths() + + blists = {} + for i in paths: + if booklists[i] is not None: + #debug_print('Booklist: ', i) + blists[i] = booklists[i] + opts = self.settings() + if opts.extra_customization: + collections = [x.lower().strip() for x in + opts.extra_customization.split(',')] + else: + collections = [] + + #debug_print('KOBO: collection fields:', collections) + for i, blist in blists.items(): + if i == 0: + oncard = 'main' + else: + oncard = 'carda' + self.update_device_database_collections(blist, collections, oncard) + + USBMS.sync_booklists(self, booklists, end_session=end_session) + #debug_print('KOBO: finished sync_booklists') + + def rebuild_collections(self, booklist, oncard): + collections_attributes = [] + self.update_device_database_collections(booklist, collections_attributes, oncard) + diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index c55936be2d..f90a8ab263 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -35,16 +35,16 @@ class PRS505(USBMS): VENDOR_NAME = 'SONY' WINDOWS_MAIN_MEM = re.compile( - r'(PRS-(505|300|500))|' - r'(PRS-((700[#/])|((6|9)00&)))' + r'(PRS-(505|500|300))|' + r'(PRS-((700[#/])|((6|9|3)(0|5)0&)))' ) WINDOWS_CARD_A_MEM = re.compile( r'(PRS-(505|500)[#/]\S+:MS)|' - r'(PRS-((700[/#]\S+:)|((6|9)00[#_]))MS)' + r'(PRS-((700[/#]\S+:)|((6|9)(0|5)0[#_]))MS)' ) WINDOWS_CARD_B_MEM = re.compile( r'(PRS-(505|500)[#/]\S+:SD)|' - r'(PRS-((700[/#]\S+:)|((6|9)00[#_]))SD)' + r'(PRS-((700[/#]\S+:)|((6|9)(0|5)0[#_]))SD)' ) diff --git a/src/calibre/devices/teclast/driver.py b/src/calibre/devices/teclast/driver.py index 0c60a367cf..2055ff9306 100644 --- a/src/calibre/devices/teclast/driver.py +++ b/src/calibre/devices/teclast/driver.py @@ -52,3 +52,14 @@ class IPAPYRUS(TECLAST_K3): VENDOR_NAME = 'E_READER' WINDOWS_MAIN_MEM = '' +class SOVOS(TECLAST_K3): + + name = 'Sovos device interface' + gui_name = 'Sovos' + description = _('Communicate with the Sovos reader.') + + FORMATS = ['epub', 'fb2', 'pdf', 'txt'] + + VENDOR_NAME = 'RK28XX' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'USB-MSC' + diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index 67a2d36607..831c16bf6a 100644 --- a/src/calibre/ebooks/chm/reader.py +++ b/src/calibre/ebooks/chm/reader.py @@ -132,7 +132,11 @@ class CHMReader(CHMFile): for path in self.Contents(): lpath = os.path.join(output_dir, path) self._ensure_dir(lpath) - data = self.GetFile(path) + try: + data = self.GetFile(path) + except: + self.log.exception('Failed to extract %s from CHM, ignoring'%path) + continue if lpath.find(';') != -1: # fix file names with ";" at the end, see _reformat() lpath = lpath.split(';')[0] diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index 7439718cf6..62a941142b 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -122,7 +122,7 @@ def add_pipeline_options(parser, plumber): 'font_size_mapping', 'line_height', 'linearize_tables', - 'extra_css', + 'extra_css', 'smarten_punctuation', 'margin_top', 'margin_left', 'margin_right', 'margin_bottom', 'change_justification', 'insert_blank_line', 'remove_paragraph_spacing','remove_paragraph_spacing_indent_size', @@ -137,7 +137,7 @@ def add_pipeline_options(parser, plumber): 'chapter', 'chapter_mark', 'prefer_metadata_cover', 'remove_first_image', 'insert_metadata', 'page_breaks_before', - 'preprocess_html', + 'preprocess_html', 'html_unwrap_factor', ] ), diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 24b35f804f..395447edba 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -241,7 +241,7 @@ OptionRecommendation(name='toc_filter', OptionRecommendation(name='chapter', recommended_value="//*[((name()='h1' or name()='h2') and " - r"re:test(., 'chapter|book|section|part\s+', 'i')) or @class " + r"re:test(., 'chapter|book|section|part|prologue|epilogue\s+', 'i')) or @class " "= 'chapter']", level=OptionRecommendation.LOW, help=_('An XPath expression to detect chapter titles. The default ' 'is to consider

or

tags that contain the words ' @@ -362,6 +362,23 @@ OptionRecommendation(name='preprocess_html', ) ), +OptionRecommendation(name='html_unwrap_factor', + recommended_value=0.40, level=OptionRecommendation.LOW, + help=_('Scale used to determine the length at which a line should ' + 'be unwrapped if preprocess is enabled. Valid values are a decimal between 0 and 1. The ' + 'default is 0.40, just below the median line length. This will unwrap typical books ' + ' with hard line breaks, but should be reduced if the line length is variable.' + ) + ), + +OptionRecommendation(name='smarten_punctuation', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Convert plain quotes, dashes and ellipsis to their ' + 'typographically correct equivalents. For details, see ' + 'http://daringfireball.net/projects/smartypants' + ) + ), + OptionRecommendation(name='remove_header', recommended_value=False, level=OptionRecommendation.LOW, help=_('Use a regular expression to try and remove the header.' diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index 256bcce6fc..92c2fe5954 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -75,6 +75,8 @@ def line_length(format, raw, percent): linere = re.compile('(?<=)', re.DOTALL) elif format == 'pdf': linere = re.compile('(?<=
).*?(?=
)', re.DOTALL) + elif format == 'spanned_html': + linere = re.compile('(?<=)', re.DOTALL) lines = linere.findall(raw) lengths = [] @@ -104,6 +106,52 @@ def line_length(format, raw, percent): return lengths[index] +class Dehyphenator(object): + ''' + Analyzes words to determine whether hyphens should be retained/removed. Uses the document + itself is as a dictionary. This method handles all languages along with uncommon, made-up, and + scientific words. The primary disadvantage is that words appearing only once in the document + retain hyphens. + ''' + + def __init__(self): + # Add common suffixes to the regex below to increase the likelihood of a match - + # don't add suffixes which are also complete words, such as 'able' or 'sex' + self.removesuffixes = re.compile(r"((ed)?ly|('e)?s|a?(t|s)ion(s|al(ly)?)?|ings?|(i)?ous|(i|a)ty|(it)?ies|ive|gence|istic|(e|a)nce|ment(s)?|ism|ated|(e|u)ct(ed)?|ed|(i|ed)?ness|(e|a)ncy|ble|ier|al|ex)$", re.IGNORECASE) + # remove prefixes if the prefix was not already the point of hyphenation + self.prefixes = re.compile(r'^(un|in|ex)$', re.IGNORECASE) + self.removeprefix = re.compile(r'^(un|in|ex)', re.IGNORECASE) + + def dehyphenate(self, match): + firsthalf = match.group('firstpart') + secondhalf = match.group('secondpart') + hyphenated = str(firsthalf) + "-" + str(secondhalf) + dehyphenated = str(firsthalf) + str(secondhalf) + lookupword = self.removesuffixes.sub('', dehyphenated) + if self.prefixes.match(firsthalf) is None: + lookupword = self.removeprefix.sub('', lookupword) + booklookup = re.compile(u'%s' % lookupword, re.IGNORECASE) + #print "lookup word is: "+str(lookupword)+", orig is: " + str(hyphenated) + match = booklookup.search(self.html) + if match: + #print "returned dehyphenated word: " + str(dehyphenated) + return dehyphenated + else: + #print "returned hyphenated word: " + str(hyphenated) + return hyphenated + + def __call__(self, html, format, length=1): + self.html = html + if format == 'html': + intextmatch = re.compile(u'(?<=.{%i})(?P[^“"\s>]+)-\s*(?=<)(\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*(?P[\w\d]+)' % length) + elif format == 'pdf': + intextmatch = re.compile(u'(?<=.{%i})(?P[^“"\s>]+)-\s*(

|\s*

\s*<[iub]>)\s*(?P[\w\d]+)'% length) + elif format == 'individual_words': + intextmatch = re.compile('>[^<]*\b(?P[^"\s>]+)-(?P)*\s*a', re.UNICODE), lambda match: u'ä'), (re.compile(u'¨\s*()*\s*A', re.UNICODE), lambda match: u'Ä'), (re.compile(u'¨\s*()*\s*e', re.UNICODE), lambda match: u'ë'), @@ -215,39 +262,38 @@ class HTMLPreProcessor(object): (re.compile(u'¸\s*()*\s*C', re.UNICODE), lambda match: u'Ç'), # ˛ - (re.compile(u'˛\s*()*\s*a', re.UNICODE), lambda match: u'ą'), - (re.compile(u'˛\s*()*\s*A', re.UNICODE), lambda match: u'Ą'), + (re.compile(u'\s*˛\s*()*\s*a', re.UNICODE), lambda match: u'ą'), + (re.compile(u'\s*˛\s*()*\s*A', re.UNICODE), lambda match: u'Ą'), (re.compile(u'˛\s*()*\s*e', re.UNICODE), lambda match: u'ę'), (re.compile(u'˛\s*()*\s*E', re.UNICODE), lambda match: u'Ę'), - + # ˙ (re.compile(u'˙\s*()*\s*z', re.UNICODE), lambda match: u'ż'), (re.compile(u'˙\s*()*\s*Z', re.UNICODE), lambda match: u'Ż'), - + + # If pdf printed from a browser then the header/footer has a reliable pattern + (re.compile(r'((?<=)\s*file:////?[A-Z].*
|file:////?[A-Z].*
(?=\s*


))', re.IGNORECASE), lambda match: ''), + + # Center separator lines + (re.compile(u'
\s*(?P([*#•]+\s*)+)\s*
'), lambda match: '

\n

' + match.group(1) + '

'), # Remove page links (re.compile(r'', re.IGNORECASE), lambda match: ''), # Remove
tags - (re.compile(r'', re.IGNORECASE), lambda match: '
'), - # Replace

with

- (re.compile(r'\s*', re.IGNORECASE), lambda match: '

'), - - # Remove hyphenation - (re.compile(r'-\n\r?'), lambda match: ''), + (re.compile(r'', re.IGNORECASE), lambda match: '
'), # Remove gray background (re.compile(r']+>'), lambda match : ''), # Detect Chapters to match default XPATH in GUI - (re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P(<(i|b)>(<(i|b)>)?)?(.?Chapter|Epilogue|Prologue|Book|Part)\s*([\d\w-]+(\s\w+)?)?(()?)?)]*>\s*(?P(<(i|b)>)?\s*\w+(\s*\w+)?\s*(</(i|b)>)?\s*(</?(br|p)[^>]*>))?', re.IGNORECASE), chap_head), - (re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P<chap>([A-Z \'"!]{5,})\s*(\d+|\w+)?)(</?p[^>]*>|<br[^>]*>)\n?((?=(<i>)?\s*\w+(\s+\w+)?(</i>)?(<br[^>]*>|</?p[^>]*>))((?P<title>.*)(<br[^>]*>|</?p[^>]*>)))?'), chap_head), + (re.compile(r'<br>\s*(?P<chap>(<[ibu]>){0,2}\s*.?(Introduction|Chapter|Epilogue|Prologue|Book|Part|Dedication|Volume|Preface|Acknowledgments)\s*([\d\w-]+\s*){0,3}\s*(</[ibu]>){0,2})\s*(<br>\s*){1,3}\s*(?P<title>(<[ibu]>){0,2}(\s*\w+){1,4}\s*(</[ibu]>){0,2}\s*<br>)?', re.IGNORECASE), chap_head), + # Cover the case where every letter in a chapter title is separated by a space + (re.compile(r'<br>\s*(?P<chap>([A-Z]\s+){4,}\s*([\d\w-]+\s*){0,3}\s*)\s*(<br>\s*){1,3}\s*(?P<title>(<[ibu]>){0,2}(\s*\w+){1,4}\s*(</[ibu]>){0,2}\s*(<br>))?'), chap_head), # Have paragraphs show better (re.compile(r'<br.*?>'), lambda match : '<p>'), # Clean up spaces (re.compile(u'(?<=[\.,;\?!”"\'])[\s^ ]*(?=<)'), lambda match: ' '), - # Connect paragraphs split by - - (re.compile(u'(?<=[^\s][-–])[\s]*(</p>)*[\s]*(<p>)*\s*(?=[^\s])'), lambda match: ''), # Add space before and after italics (re.compile(u'(?<!“)<i>'), lambda match: ' <i>'), (re.compile(r'</i>(?=\w)'), lambda match: '</i> '), @@ -328,12 +374,29 @@ class HTMLPreProcessor(object): print 'Failed to parse remove_footer regexp' traceback.print_exc() + # unwrap em/en dashes, delete soft hyphens - moved here so it's executed after header/footer removal + if is_pdftohtml: + # unwrap em/en dashes + end_rules.append((re.compile(u'(?<=[–—])\s*<p>\s*(?=[[a-z\d])'), lambda match: '')) + # unwrap/delete soft hyphens + end_rules.append((re.compile(u'[­](\s*<p>)+\s*(?=[[a-z\d])'), lambda match: '')) + # unwrap/delete soft hyphens with formatting + end_rules.append((re.compile(u'[­]\s*(</(i|u|b)>)+(\s*<p>)+\s*(<(i|u|b)>)+\s*(?=[[a-z\d])'), lambda match: '')) + + # Make the more aggressive chapter marking regex optional with the preprocess option to + # reduce false positives and move after header/footer removal + if getattr(self.extra_opts, 'preprocess_html', None): + if is_pdftohtml: + end_rules.append((re.compile(r'<p>\s*(?P<chap>(<[ibu]>){0,2}\s*([A-Z \'"!]{3,})\s*([\dA-Z:]+\s){0,4}\s*(</[ibu]>){0,2})\s*<p>\s*(?P<title>(<[ibu]>){0,2}(\s*\w+){1,4}\s*(</[ibu]>){0,2}\s*<p>)?'), chap_head),) + + length = -1 if getattr(self.extra_opts, 'unwrap_factor', 0.0) > 0.01: length = line_length('pdf', html, getattr(self.extra_opts, 'unwrap_factor')) if length: + # print "The pdf line length returned is " + str(length) end_rules.append( # Un wrap using punctuation - (re.compile(r'(?<=.{%i}[a-z\.,;:)\-IA])\s*(?P<ital></(i|b|u)>)?\s*(<p.*?>)\s*(?=(<(i|b|u)>)?\s*[\w\d(])' % length, re.UNICODE), wrap_lines), + (re.compile(r'(?<=.{%i}([a-z,:)\IA]|(?<!\&\w{4});))\s*(?P<ital></(i|b|u)>)?\s*(<p.*?>\s*)+\s*(?=(<(i|b|u)>)?\s*[\w\d$(])' % length, re.UNICODE), wrap_lines), ) for rule in self.PREPROCESS + start_rules: @@ -363,6 +426,11 @@ class HTMLPreProcessor(object): for rule in rules + end_rules: html = rule[0].sub(rule[1], html) + if is_pdftohtml and length > -1: + # Dehyphenate + dehyphenator = Dehyphenator() + html = dehyphenator(html,'pdf', length) + #dump(html, 'post-preprocess') # Handle broken XHTML w/ SVG (ugh) @@ -381,7 +449,16 @@ class HTMLPreProcessor(object): html = unidecoder.decode(html) if self.plugin_preprocess: - html = self.input_plugin_preprocess(html) + html = self.input_plugin_preprocess(self.extra_opts, html) + + if getattr(self.extra_opts, 'smarten_punctuation', False): + html = self.smarten_punctuation(html) return html + def smarten_punctuation(self, html): + from calibre.utils.smartypants import smartyPants + from calibre.ebooks.chardet import substitute_entites + html = smartyPants(html) + return substitute_entites(html) + diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py new file mode 100644 index 0000000000..6a5eaa4a34 --- /dev/null +++ b/src/calibre/ebooks/conversion/utils.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' +__docformat__ = 'restructuredtext en' + +import re +from calibre.ebooks.conversion.preprocess import line_length, Dehyphenator +from calibre.utils.logging import default_log + +class PreProcessor(object): + + def __init__(self, extra_opts=None, log=None): + self.log = default_log if log is None else log + self.html_preprocess_sections = 0 + self.found_indents = 0 + self.extra_opts = extra_opts + + def chapter_head(self, match): + chap = match.group('chap') + title = match.group('title') + if not title: + self.html_preprocess_sections = self.html_preprocess_sections + 1 + self.log("found " + str(self.html_preprocess_sections) + " chapters. - " + str(chap)) + return '<h2>'+chap+'</h2>\n' + else: + self.html_preprocess_sections = self.html_preprocess_sections + 1 + self.log("found " + str(self.html_preprocess_sections) + " chapters & titles. - " + str(chap) + ", " + str(title)) + return '<h2>'+chap+'</h2>\n<h3>'+title+'</h3>\n' + + def chapter_break(self, match): + chap = match.group('section') + styles = match.group('styles') + self.html_preprocess_sections = self.html_preprocess_sections + 1 + self.log("marked " + str(self.html_preprocess_sections) + " section markers based on punctuation. - " + str(chap)) + return '<'+styles+' style="page-break-before:always">'+chap + + def insert_indent(self, match): + pstyle = match.group('formatting') + span = match.group('span') + self.found_indents = self.found_indents + 1 + if pstyle: + if not span: + return '<p '+pstyle+' style="text-indent:3%">' + else: + return '<p '+pstyle+' style="text-indent:3%">'+span + else: + if not span: + return '<p style="text-indent:3%">' + else: + return '<p style="text-indent:3%">'+span + + def no_markup(self, raw, percent): + ''' + Detects total marked up line endings in the file. raw is the text to + inspect. Percent is the minimum percent of line endings which should + be marked up to return true. + ''' + htm_end_ere = re.compile('</p>', re.DOTALL) + line_end_ere = re.compile('(\n|\r|\r\n)', re.DOTALL) + htm_end = htm_end_ere.findall(raw) + line_end = line_end_ere.findall(raw) + tot_htm_ends = len(htm_end) + tot_ln_fds = len(line_end) + self.log("There are " + str(tot_ln_fds) + " total Line feeds, and " + str(tot_htm_ends) + " marked up endings") + + if percent > 1: + percent = 1 + if percent < 0: + percent = 0 + + min_lns = tot_ln_fds * percent + self.log("There must be fewer than " + str(min_lns) + " unmarked lines to add markup") + if min_lns > tot_htm_ends: + return True + + def __call__(self, html): + self.log("********* Preprocessing HTML *********") + ###### Check Markup ###### + # + # some lit files don't have any <p> tags or equivalent (generally just plain text between + # <pre> tags), check and mark up line endings if required before proceeding + if self.no_markup(html, 0.1): + self.log("not enough paragraph markers, adding now") + # check if content is in pre tags, use txt procesor to mark up if so + pre = re.compile(r'<pre>', re.IGNORECASE) + if len(pre.findall(html)) == 1: + self.log("Running Text Processing") + from calibre.ebooks.txt.processor import convert_basic, preserve_spaces, \ + separate_paragraphs_single_line + outerhtml = re.compile(r'.*?(?<=<pre>)(?P<text>.*)(?=</pre>).*', re.IGNORECASE|re.DOTALL) + html = outerhtml.sub('\g<text>', html) + html = separate_paragraphs_single_line(html) + html = preserve_spaces(html) + html = convert_basic(html, epub_split_size_kb=0) + else: + # Add markup naively + # TODO - find out if there are cases where there are more than one <pre> tag or + # other types of unmarked html and handle them in some better fashion + add_markup = re.compile('(?<!>)(\n)') + html = add_markup.sub('</p>\n<p>', html) + + ###### Mark Indents/Cleanup ###### + # + # Replace series of non-breaking spaces with text-indent + txtindent = re.compile(ur'<p(?P<formatting>[^>]*)>\s*(?P<span>(<span[^>]*>\s*)+)?\s*(\u00a0){2,}', re.IGNORECASE) + html = txtindent.sub(self.insert_indent, html) + if self.found_indents > 1: + self.log("replaced "+str(self.found_indents)+ " nbsp indents with inline styles") + # remove remaining non-breaking spaces + html = re.sub(ur'\u00a0', ' ', html) + # Get rid of empty <o:p> tags to simplify other processing + html = re.sub(ur'\s*<o:p>\s*</o:p>', ' ', html) + # Get rid of empty span, bold, & italics tags + html = re.sub(r"\s*<span[^>]*>\s*(<span[^>]>\s*</span>){0,2}\s*</span>\s*", " ", html) + html = re.sub(r"\s*<[ibu][^>]*>\s*(<[ibu][^>]*>\s*</[ibu]>\s*){0,2}\s*</[ibu]>", " ", html) + html = re.sub(r"\s*<span[^>]*>\s*(<span[^>]>\s*</span>){0,2}\s*</span>\s*", " ", html) + + # If more than 40% of the lines are empty paragraphs then delete them to clean up spacing + linereg = re.compile('(?<=<p).*?(?=</p>)', re.IGNORECASE|re.DOTALL) + blankreg = re.compile(r'\s*(?P<openline><p[^>]*>)\s*(?P<closeline></p>)', re.IGNORECASE) + #multi_blank = re.compile(r'(\s*<p[^>]*>\s*(<(b|i|u)>)?\s*(</(b|i|u)>)?\s*</p>){2,}', re.IGNORECASE) + blanklines = blankreg.findall(html) + lines = linereg.findall(html) + if len(lines) > 1: + self.log("There are " + str(len(blanklines)) + " blank lines. " + str(float(len(blanklines)) / float(len(lines))) + " percent blank") + if float(len(blanklines)) / float(len(lines)) > 0.40 and getattr(self.extra_opts, + 'remove_paragraph_spacing', False): + self.log("deleting blank lines") + html = blankreg.sub('', html) + # Arrange line feeds and </p> tags so the line_length and no_markup functions work correctly + html = re.sub(r"\s*</p>", "</p>\n", html) + html = re.sub(r"\s*<p>\s*", "\n<p>", html) + # detect chapters/sections to match xpath or splitting logic + heading = re.compile('<h[1-3][^>]*>', re.IGNORECASE) + self.html_preprocess_sections = len(heading.findall(html)) + self.log("found " + str(self.html_preprocess_sections) + " pre-existing headings") + # + # Start with most typical chapter headings, get more aggressive until one works + if self.html_preprocess_sections < 10: + chapdetect = re.compile(r'(?=</?(br|p))(<(/?br|p)[^>]*>)\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<chap>(<[ibu][^>]*>){0,2}\s*.?(Introduction|Synopsis|Acknowledgements|Chapter|Epilogue|Volume|Prologue|Book\s|Part\s|Dedication)\s*([\d\w-]+\:?\s*){0,8}\s*(</[ibu]>){0,2})\s*(</span>)?s*(</[ibu]>){0,2}\s*(</span>)?\s*(</(p|/?br)>)\s*\s*(\s*<p[^>]*>\s*</p>){0,2}\s*(<(/?br|p)[^>]*>\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<title>(<[ibu][^>]*>){0,2}(\s*[\w\'\"-]+){1,5}\s*(</[ibu]>){0,2})\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</(br|p)>))?', re.IGNORECASE|re.VERBOSE) + html = chapdetect.sub(self.chapter_head, html) + if self.html_preprocess_sections < 10: + self.log("not enough chapters, only " + str(self.html_preprocess_sections) + ", trying numeric chapters") + chapdetect2 = re.compile(r'(?=</?(br|p))(<(/?br|p)[^>]*>)\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<chap>(<[ibu][^>]*>){0,2}\s*.?(\d+\.?|(CHAPTER\s*([\dA-Z\-\'\"\?\.!#,]+\s*){1,10}))\s*(</[ibu]>){0,2})\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</(p|/?br)>)\s*(<(/?br|p)[^>]*>\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<title>(<[ibu][^>]*>){0,2}(\s*[\w\'\"-]+){1,5}\s*(</[ibu]>){0,2})\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</(br|p)>))?', re.UNICODE) + html = chapdetect2.sub(self.chapter_head, html) + + if self.html_preprocess_sections < 10: + self.log("not enough chapters, only " + str(self.html_preprocess_sections) + ", trying with uppercase words") + chapdetect2 = re.compile(r'(?=</?(br|p))(<(/?br|p)[^>]*>)\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<chap>(<[ibu][^>]*>){0,2}\s*.?([A-Z#\-\s]+)\s*(</[ibu]>){0,2})\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</(p|/?br)>)\s*(<(/?br|p)[^>]*>\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(?P<title>(<[ibu][^>]*>){0,2}(\s*[\w\'\"-]+){1,5}\s*(</[ibu]>){0,2})\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</(br|p)>))?', re.UNICODE) + html = chapdetect2.sub(self.chapter_head, html) + + ###### Unwrap lines ###### + # + self.log("Unwrapping Lines") + # Some OCR sourced files have line breaks in the html using a combination of span & p tags + # span are used for hard line breaks, p for new paragraphs. Determine which is used so + # that lines can be un-wrapped across page boundaries + paras_reg = re.compile('<p[^>]*>', re.IGNORECASE) + spans_reg = re.compile('<span[^>]*>', re.IGNORECASE) + paras = len(paras_reg.findall(html)) + spans = len(spans_reg.findall(html)) + if spans > 1: + if float(paras) / float(spans) < 0.75: + format = 'spanned_html' + else: + format = 'html' + else: + format = 'html' + + # Calculate Length + length = line_length(format, html, getattr(self.extra_opts, + 'html_unwrap_factor', 0.4)) + self.log("*** Median line length is " + str(length) + ", calculated with " + format + " format ***") + max_length = length * 1.4 + min_max = str("(?<=.{"+str(length)+"})(?<!.{"+str(max_length)+"})") + # + # Unwrap em/en dashes, delete soft-hyphens + #self.log("\n\n\n\n\n\n\n\n\n\n\n"+html+"\n\n\n\n\n\n\n\n\n\n\n\n\n") + html = re.sub(u'\xad\s*(</span>\s*(</[iubp]>\s*<[iubp][^>]*>\s*)?<span[^>]*>|</[iubp]>\s*<[iubp][^>]*>)?\s*', '', html) + html = re.sub(u'%s(?<=[\u2013\u2014])\s*(?=<)(</span>\s*(</[iubp]>\s*<[iubp][^>]*>\s*)?<span[^>]*>|</[iubp]>\s*<[iubp][^>]*>)?\s*(?=[[a-z\d])' % min_max, '', html) + # Dehyphenate + dehyphenator = Dehyphenator() + html = dehyphenator(html,'html', length) + + # Unwrap lines using punctation and line length + unwrap = re.compile(r"(?<=.{%i}([a-z,;):\IA]|(?<!\&\w{4});))\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) + html = unwrap.sub(' ', html) + + # If still no sections after unwrapping mark split points on lines with no punctuation + if self.html_preprocess_sections < 10: + self.log("Looking for more split points based on punctuation, currently have " + str(self.html_preprocess_sections)) + chapdetect3 = re.compile(r'<(?P<styles>(p|div)[^>]*)>\s*(?P<section>(<span[^>]*>)?\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*(<[ibu][^>]*>){0,2}\s*(<span[^>]*>)?\s*.?(?=[a-z#\-*\s]+<)([a-z#-*]+\s*){1,5}\s*\s*(</span>)?(</[ibu]>){0,2}\s*(</span>)?\s*(</[ibu]>){0,2}\s*(</span>)?\s*</(p|div)>)', re.IGNORECASE) + html = chapdetect3.sub(self.chapter_break, html) + # search for places where a first or second level heading is immediately followed by another + # top level heading. demote the second heading to h3 to prevent splitting between chapter + # headings and titles, images, etc + doubleheading = re.compile(r'(?P<firsthead><h(1|2)[^>]*>.+?</h(1|2)>\s*(<(?!h\d)[^>]*>\s*)*)<h(1|2)(?P<secondhead>[^>]*>.+?)</h(1|2)>', re.IGNORECASE) + html = doubleheading.sub('\g<firsthead>'+'\n<h3'+'\g<secondhead>'+'</h3>', html) + + # put back non-breaking spaces in empty paragraphs to preserve original formatting + html = blankreg.sub('\n'+r'\g<openline>'+u'\u00a0'+r'\g<closeline>', html) + + return html diff --git a/src/calibre/ebooks/fb2/output.py b/src/calibre/ebooks/fb2/output.py index d0125afe89..d6c7a25a90 100644 --- a/src/calibre/ebooks/fb2/output.py +++ b/src/calibre/ebooks/fb2/output.py @@ -28,6 +28,9 @@ class FB2Output(OutputFormatPlugin): ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): + from calibre.ebooks.oeb.transforms.jacket import linearize_jacket + linearize_jacket(oeb_book) + fb2mlizer = FB2MLizer(log) fb2_content = fb2mlizer.extract_content(oeb_book, opts) diff --git a/src/calibre/ebooks/html/input.py b/src/calibre/ebooks/html/input.py index d57bfddd3e..603adadb53 100644 --- a/src/calibre/ebooks/html/input.py +++ b/src/calibre/ebooks/html/input.py @@ -24,7 +24,7 @@ from calibre.constants import islinux, isfreebsd, iswindows from calibre import unicode_path from calibre.utils.localization import get_lang from calibre.utils.filenames import ascii_filename -from calibre.ebooks.conversion.preprocess import line_length +from calibre.ebooks.conversion.utils import PreProcessor class Link(object): ''' @@ -490,21 +490,8 @@ class HTMLInput(InputFormatPlugin): return (None, None) return (None, raw) - def preprocess_html(self, html): - if not hasattr(self, 'log'): - from calibre.utils.logging import default_log - self.log = default_log - self.log("********* Preprocessing HTML *********") - # Detect Chapters to match the xpath in the GUI - chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE) - html = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', html) - # Unwrap lines using punctation if the median length of all lines is less than 150 - # - # Insert extra line feeds so the line length regex functions properly - html = re.sub(r"</p>", "</p>\n", html) - length = line_length('html', html, 0.4) - self.log.debug("*** Median length is " + str(length) + " ***") - unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) - if length < 150: - html = unwrap.sub(' ', html) - return html + def preprocess_html(self, options, html): + self.options = options + preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + return preprocessor(html) + diff --git a/src/calibre/ebooks/lit/input.py b/src/calibre/ebooks/lit/input.py index 9bf20fb1d4..46a5e75977 100644 --- a/src/calibre/ebooks/lit/input.py +++ b/src/calibre/ebooks/lit/input.py @@ -6,10 +6,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import re - from calibre.customize.conversion import InputFormatPlugin -from calibre.ebooks.conversion.preprocess import line_length +from calibre.ebooks.conversion.utils import PreProcessor + class LITInput(InputFormatPlugin): @@ -54,19 +53,8 @@ class LITInput(InputFormatPlugin): pre.append(ne) - def preprocess_html(self, html): - self.log("********* Preprocessing HTML *********") - # Detect Chapters to match the xpath in the GUI - chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE) - html = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', html) - # Unwrap lines using punctation if the median length of all lines is less than 150 - # - # Insert extra line feeds so the line length regex functions properly - html = re.sub(r"</p>", "</p>\n", html) - length = line_length('html', html, 0.4) - self.log("*** Median length is " + str(length) + " ***") - unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) - if length < 150: - html = unwrap.sub(' ', html) - return html + def preprocess_html(self, options, html): + self.options = options + preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + return preprocessor(html) diff --git a/src/calibre/ebooks/lrf/input.py b/src/calibre/ebooks/lrf/input.py index 1d730ab573..70529c0a04 100644 --- a/src/calibre/ebooks/lrf/input.py +++ b/src/calibre/ebooks/lrf/input.py @@ -12,6 +12,7 @@ from copy import deepcopy from lxml import etree from calibre.customize.conversion import InputFormatPlugin +from calibre.ebooks.conversion.utils import PreProcessor from calibre import guess_type class Canvas(etree.XSLTExtension): @@ -419,4 +420,10 @@ class LRFInput(InputFormatPlugin): styles.write() return os.path.abspath('content.opf') + def preprocess_html(self, options, html): + self.options = options + preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + return preprocessor(html) + + diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index 041a1ee603..df9a394258 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -176,6 +176,7 @@ def get_metadata(stream, extract_cover=True): except: import traceback traceback.print_exc() + mi.timestamp = None return mi def get_quick_metadata(stream): diff --git a/src/calibre/ebooks/mobi/input.py b/src/calibre/ebooks/mobi/input.py index 487e70c04f..9ab7996a74 100644 --- a/src/calibre/ebooks/mobi/input.py +++ b/src/calibre/ebooks/mobi/input.py @@ -3,6 +3,7 @@ __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' +import re from calibre.customize.conversion import InputFormatPlugin class MOBIInput(InputFormatPlugin): @@ -37,3 +38,12 @@ class MOBIInput(InputFormatPlugin): include_meta_content_type=False)) accelerators['pagebreaks'] = '//h:div[@class="mbp_pagebreak"]' return mr.created_opf_path + + def preprocess_html(self, options, html): + # search for places where a first or second level heading is immediately followed by another + # top level heading. demote the second heading to h3 to prevent splitting between chapter + # headings and titles, images, etc + doubleheading = re.compile(r'(?P<firsthead><h(1|2)[^>]*>.+?</h(1|2)>\s*(<(?!h\d)[^>]*>\s*)*)<h(1|2)(?P<secondhead>[^>]*>.+?)</h(1|2)>', re.IGNORECASE) + html = doubleheading.sub('\g<firsthead>'+'\n<h3'+'\g<secondhead>'+'</h3>', html) + return html + diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 5d5de7b153..37936d6016 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1574,14 +1574,15 @@ class MobiWriter(object): id = unicode(oeb.metadata.cover[0]) item = oeb.manifest.ids[id] href = item.href - index = self._images[href] - 1 - exth.write(pack('>III', 0xc9, 0x0c, index)) - exth.write(pack('>III', 0xcb, 0x0c, 0)) - nrecs += 2 - index = self._add_thumbnail(item) - if index is not None: - exth.write(pack('>III', 0xca, 0x0c, index - 1)) - nrecs += 1 + if href in self._images: + index = self._images[href] - 1 + exth.write(pack('>III', 0xc9, 0x0c, index)) + exth.write(pack('>III', 0xcb, 0x0c, 0)) + nrecs += 2 + index = self._add_thumbnail(item) + if index is not None: + exth.write(pack('>III', 0xca, 0x0c, index - 1)) + nrecs += 1 exth = exth.getvalue() trail = len(exth) % 4 @@ -1695,11 +1696,12 @@ class MobiWriter(object): header.write(pack('>I', 1)) # 0x1c - 0x1f : Text encoding ? - # GR: Language encoding for NCX entries (latin_1) - header.write(pack('>I', 0x4e4)) + # header.write(pack('>I', 650001)) + # GR: This needs to be either 0xFDE9 or 0x4E4 + header.write(pack('>I', 0xFDE9)) - # 0x20 - 0x23 : Mimicking kindleGen - header.write(pack('>I', 0xFFFFFFFF)) + # 0x20 - 0x23 : Language code? + header.write(iana2mobi(str(self._oeb.metadata.language[0]))) # 0x24 - 0x27 : Number of TOC entries in INDX1 header.write(pack('>I', indxt_count + 1)) @@ -1799,7 +1801,7 @@ class MobiWriter(object): text = text.strip() if not isinstance(text, unicode): text = text.decode('utf-8', 'replace') - text = text.encode('cp1252','replace') + text = text.encode('ascii','replace') return text def _add_to_ctoc(self, ctoc_str, record_offset): @@ -2149,26 +2151,6 @@ class MobiWriter(object): indxt.write(decint(self._ctoc_map[index]['titleOffset'], DECINT_FORWARD)) # vwi title offset in CNCX indxt.write(decint(0, DECINT_FORWARD)) # unknown byte - def _write_subchapter_node(self, indxt, indices, index, offset, length, count): - # This style works without a parent chapter, mimicking what KindleGen does, - # using a value of 0x0B for parentIndex - # Writes an INDX1 NCXEntry of entryType 0x1F - subchapter - if self.opts.verbose > 2: - # *** GR: Turn this off while I'm developing my code - #self._oeb.log.debug('Writing TOC node to IDXT:', node.title, 'href:', node.href) - pass - - pos = 0xc0 + indxt.tell() - indices.write(pack('>H', pos)) # Save the offset for IDXTIndices - name = "%04X"%count - indxt.write(chr(len(name)) + name) # Write the name - indxt.write(INDXT['subchapter']) # entryType [0x0F | 0xDF | 0xFF | 0x3F] - indxt.write(decint(offset, DECINT_FORWARD)) # offset - indxt.write(decint(length, DECINT_FORWARD)) # length - indxt.write(decint(self._ctoc_map[index]['titleOffset'], DECINT_FORWARD)) # vwi title offset in CNCX - indxt.write(decint(0, DECINT_FORWARD)) # unknown byte - indxt.write(decint(0xb, DECINT_FORWARD)) # parentIndex - null - def _compute_offset_length(self, i, node, entries) : h = node.href if h not in self._id_offsets: diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index 7f56cb4d2d..91028c2bc5 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -15,7 +15,7 @@ from calibre.customize.ui import available_input_formats from calibre.ebooks.metadata.opf2 import OPF from calibre.ptempfile import TemporaryDirectory from calibre.ebooks.chardet import xml_to_unicode -from calibre.utils.zipfile import safe_replace, ZipFile +from calibre.utils.zipfile import safe_replace from calibre.utils.config import DynamicConfig from calibre.utils.logging import Log from calibre import guess_type, prints @@ -294,12 +294,8 @@ class EbookIterator(object): zf = open(self.pathtoebook, 'r+b') except IOError: return - zipf = ZipFile(zf, mode='a') - for name in zipf.namelist(): - if name == 'META-INF/calibre_bookmarks.txt': - safe_replace(zf, 'META-INF/calibre_bookmarks.txt', StringIO(dat)) - return - zipf.writestr('META-INF/calibre_bookmarks.txt', dat) + safe_replace(zf, 'META-INF/calibre_bookmarks.txt', StringIO(dat), + add_missing=True) else: self.config['bookmarks_'+self.pathtoebook] = dat diff --git a/src/calibre/ebooks/oeb/transforms/cover.py b/src/calibre/ebooks/oeb/transforms/cover.py index 59b42df68a..532c9bbc03 100644 --- a/src/calibre/ebooks/oeb/transforms/cover.py +++ b/src/calibre/ebooks/oeb/transforms/cover.py @@ -99,7 +99,8 @@ class CoverManager(object): series_string = None if m.series and m.series_index: series_string = _('Book %s of %s')%( - fmt_sidx(m.series_index[0], use_roman=True), m.series[0]) + fmt_sidx(m.series_index[0], use_roman=True), + unicode(m.series[0])) try: from calibre.ebooks import calibre_cover diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index f48bdb9934..7b83421097 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -138,6 +138,7 @@ class CSSFlattener(object): float(self.context.margin_left)) bs.append('margin-right : %fpt'%\ float(self.context.margin_right)) + bs.extend(['padding-left: 0pt', 'padding-right: 0pt']) if self.context.change_justification != 'original': bs.append('text-align: '+ self.context.change_justification) body.set('style', '; '.join(bs)) @@ -146,7 +147,6 @@ class CSSFlattener(object): extra_css=css) self.stylizers[item] = stylizer - def baseline_node(self, node, stylizer, sizes, csize): csize = stylizer.style(node)['font-size'] if node.text: @@ -194,7 +194,7 @@ class CSSFlattener(object): value = 0.0 cssdict[property] = "%0.5fem" % (value / fsize) - def flatten_node(self, node, stylizer, names, styles, psize, left=0): + def flatten_node(self, node, stylizer, names, styles, psize, item_id, left=0): if not isinstance(node.tag, basestring) \ or namespace(node.tag) != XHTML_NS: return @@ -219,7 +219,10 @@ class CSSFlattener(object): fnums = self.context.source.fnums if size[0] in ('+', '-'): # Oh, the warcrimes - esize = 3 + force_int(size) + try: + esize = 3 + force_int(size) + except: + esize = 3 if esize < 1: esize = 1 if esize > 7: @@ -286,15 +289,18 @@ class CSSFlattener(object): if self.lineh and 'line-height' not in cssdict: lineh = self.lineh / psize cssdict['line-height'] = "%0.5fem" % lineh + if (self.context.remove_paragraph_spacing or self.context.insert_blank_line) and tag in ('p', 'div'): - for prop in ('margin', 'padding', 'border'): - for edge in ('top', 'bottom'): - cssdict['%s-%s'%(prop, edge)] = '0pt' + if item_id != 'calibre_jacket' or self.context.output_profile.name == 'Kindle': + for prop in ('margin', 'padding', 'border'): + for edge in ('top', 'bottom'): + cssdict['%s-%s'%(prop, edge)] = '0pt' if self.context.insert_blank_line: cssdict['margin-top'] = cssdict['margin-bottom'] = '0.5em' if self.context.remove_paragraph_spacing: cssdict['text-indent'] = "%1.1fem" % self.context.remove_paragraph_spacing_indent_size + if cssdict: items = cssdict.items() items.sort() @@ -313,7 +319,7 @@ class CSSFlattener(object): if 'style' in node.attrib: del node.attrib['style'] for child in node: - self.flatten_node(child, stylizer, names, styles, psize, left) + self.flatten_node(child, stylizer, names, styles, psize, item_id, left) def flatten_head(self, item, stylizer, href): html = item.data @@ -360,7 +366,7 @@ class CSSFlattener(object): stylizer = self.stylizers[item] body = html.find(XHTML('body')) fsize = self.context.dest.fbase - self.flatten_node(body, stylizer, names, styles, fsize) + self.flatten_node(body, stylizer, names, styles, fsize, item.id) items = [(key, val) for (val, key) in styles.items()] items.sort() css = ''.join(".%s {\n%s;\n}\n\n" % (key, val) for key, val in items) diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index fec4d230c3..88c7a4ff0e 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -6,139 +6,200 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import textwrap +import sys from xml.sax.saxutils import escape -from itertools import repeat from lxml import etree -from calibre.ebooks.oeb.base import XPath, XPNSMAP -from calibre import guess_type +from calibre import guess_type, strftime +from calibre.ebooks.BeautifulSoup import BeautifulSoup +from calibre.ebooks.oeb.base import XPath, XHTML_NS, XHTML from calibre.library.comments import comments_to_html + +JACKET_XPATH = '//h:meta[@name="calibre-content" and @content="jacket"]' + class Jacket(object): ''' Book jacket manipulation. Remove first image and insert comments at start of book. ''' - JACKET_TEMPLATE = textwrap.dedent(u'''\ - <html xmlns="%(xmlns)s"> - <head> - <title>%(title)s - - - -

-
-

%(title)s

-

%(jacket)s

-
%(series)s
-
%(rating)s
-
%(tags)s
-
-
- %(comments)s -
-
- - - ''') + def remove_images(self, item, limit=1): + path = XPath('//h:img[@src]') + removed = 0 + for img in path(item.data): + if removed >= limit: + break + href = item.abshref(img.get('src')) + image = self.oeb.manifest.hrefs.get(href, None) + if image is not None: + self.oeb.manifest.remove(image) + img.getparent().remove(img) + removed += 1 + return removed def remove_first_image(self): - path = XPath('//h:img[@src]') - for i, item in enumerate(self.oeb.spine): - if i > 2: break - for img in path(item.data): - href = item.abshref(img.get('src')) - image = self.oeb.manifest.hrefs.get(href, None) - if image is not None: - self.log('Removing first image', img.get('src')) - self.oeb.manifest.remove(image) - img.getparent().remove(img) - return - - def get_rating(self, rating): - ans = '' - if rating is None: - return - try: - num = float(rating)/2 - except: - return ans - num = max(0, num) - num = min(num, 5) - if num < 1: - return ans - id, href = self.oeb.manifest.generate('star', 'star.png') - self.oeb.manifest.add(id, href, 'image/png', data=I('star.png', data=True)) - ans = 'Rating: ' + ''.join(repeat('star'%href, num)) - return ans + for item in self.oeb.spine: + removed = self.remove_images(item) + if removed > 0: + self.log('Removed first image') + break def insert_metadata(self, mi): self.log('Inserting metadata into book...') - comments = mi.comments - if not comments: - try: - comments = unicode(self.oeb.metadata.description[0]) - except: - comments = '' - if not comments.strip(): - comments = '' - orig_comments = comments - if comments: - comments = comments_to_html(comments) - series = 'Series: ' + escape(mi.series if mi.series else '') - if mi.series and mi.series_index is not None: - series += escape(' [%s]'%mi.format_series_index()) - if not mi.series: - series = '' - tags = mi.tags - if not tags: - try: - tags = map(unicode, self.oeb.metadata.subject) - except: - tags = [] - if tags: - tags = 'Tags: ' + self.opts.dest.tags_to_string(tags) - else: - tags = '' + try: - title = mi.title if mi.title else unicode(self.oeb.metadata.title[0]) + tags = map(unicode, self.oeb.metadata.subject) + except: + tags = [] + + try: + comments = unicode(self.oeb.metadata.description[0]) + except: + comments = '' + + try: + title = unicode(self.oeb.metadata.title[0]) except: title = _('Unknown') - def generate_html(comments): - return self.JACKET_TEMPLATE%dict(xmlns=XPNSMAP['h'], - title=escape(title), comments=comments, - jacket=escape(_('Book Jacket')), series=series, - tags=tags, rating=self.get_rating(mi.rating)) - id, href = self.oeb.manifest.generate('jacket', 'jacket.xhtml') - from calibre.ebooks.oeb.base import RECOVER_PARSER, XPath - try: - root = etree.fromstring(generate_html(comments), parser=RECOVER_PARSER) - except: - root = etree.fromstring(generate_html(escape(orig_comments)), - parser=RECOVER_PARSER) - jacket = XPath('//h:meta[@name="calibre-content" and @content="jacket"]') - found = None - for item in list(self.oeb.spine)[:4]: - try: - if jacket(item.data): - found = item - break - except: - continue - if found is None: - item = self.oeb.manifest.add(id, href, guess_type(href)[0], data=root) - self.oeb.spine.insert(0, item, True) - else: - self.log('Found existing book jacket, replacing...') - found.data = root + root = render_jacket(mi, self.opts.output_profile, + alt_title=title, alt_tags=tags, + alt_comments=comments) + id, href = self.oeb.manifest.generate('calibre_jacket', 'jacket.xhtml') + item = self.oeb.manifest.add(id, href, guess_type(href)[0], data=root) + self.oeb.spine.insert(0, item, True) + + def remove_existing_jacket(self): + for x in self.oeb.spine[:4]: + if XPath(JACKET_XPATH)(x.data): + self.remove_images(x, limit=sys.maxint) + self.oeb.manifest.remove(x) + self.log('Removed existing jacket') + break def __call__(self, oeb, opts, metadata): + ''' + Add metadata in jacket.xhtml if specified in opts + If not specified, remove previous jacket instance + ''' self.oeb, self.opts, self.log = oeb, opts, oeb.log + self.remove_existing_jacket() if opts.remove_first_image: self.remove_first_image() if opts.insert_metadata: self.insert_metadata(metadata) + +# Render Jacket {{{ + +def get_rating(rating, rchar): + ans = '' + try: + num = float(rating)/2 + except: + return ans + num = max(0, num) + num = min(num, 5) + if num < 1: + return ans + + ans = rchar * int(num) + return ans + + +def render_jacket(mi, output_profile, + alt_title=_('Unknown'), alt_tags=[], alt_comments=''): + css = P('jacket/stylesheet.css', data=True).decode('utf-8') + + try: + title_str = mi.title if mi.title else alt_title + except: + title_str = _('Unknown') + title = '%s' % (escape(title_str)) + + series = escape(mi.series if mi.series else '') + if mi.series and mi.series_index is not None: + series += escape(' [%s]'%mi.format_series_index()) + if not mi.series: + series = '' + + try: + pubdate = strftime(u'%Y', mi.pubdate.timetuple()) + except: + pubdate = '' + + rating = get_rating(mi.rating, output_profile.ratings_char) + + tags = mi.tags if mi.tags else alt_tags + if tags: + tags = output_profile.tags_to_string(tags) + else: + tags = '' + + comments = mi.comments if mi.comments else alt_comments + comments = comments.strip() + orig_comments = comments + if comments: + comments = comments_to_html(comments) + + def generate_html(comments): + args = dict(xmlns=XHTML_NS, + title_str=title_str, + css=css, + title=title, + pubdate_label=_('Published'), pubdate=pubdate, + series_label=_('Series'), series=series, + rating_label=_('Rating'), rating=rating, + tags_label=_('Tags'), tags=tags, + comments=comments, + footer='' + ) + + generated_html = P('jacket/template.xhtml', + data=True).decode('utf-8').format(**args) + + # Post-process the generated html to strip out empty header items + soup = BeautifulSoup(generated_html) + if not series: + series_tag = soup.find('tr', attrs={'class':'cbj_series'}) + series_tag.extract() + if not rating: + rating_tag = soup.find('tr', attrs={'class':'cbj_rating'}) + rating_tag.extract() + if not tags: + tags_tag = soup.find('tr', attrs={'class':'cbj_tags'}) + tags_tag.extract() + if not pubdate: + pubdate_tag = soup.find('tr', attrs={'class':'cbj_pubdate'}) + pubdate_tag.extract() + if output_profile.short_name != 'kindle': + hr_tag = soup.find('hr', attrs={'class':'cbj_kindle_banner_hr'}) + hr_tag.extract() + + return soup.renderContents(None) + + from calibre.ebooks.oeb.base import RECOVER_PARSER + + try: + root = etree.fromstring(generate_html(comments), parser=RECOVER_PARSER) + except: + try: + root = etree.fromstring(generate_html(escape(orig_comments)), + parser=RECOVER_PARSER) + except: + root = etree.fromstring(generate_html(''), + parser=RECOVER_PARSER) + return root + +# }}} + +def linearize_jacket(oeb): + for x in oeb.spine[:4]: + if XPath(JACKET_XPATH)(x.data): + for e in XPath('//h:table|//h:tr|//h:th')(x.data): + e.tag = XHTML('div') + for e in XPath('//h:td')(x.data): + e.tag = XHTML('span') + break + diff --git a/src/calibre/ebooks/oeb/transforms/rescale.py b/src/calibre/ebooks/oeb/transforms/rescale.py index 55aafded5c..c3b4d6d40c 100644 --- a/src/calibre/ebooks/oeb/transforms/rescale.py +++ b/src/calibre/ebooks/oeb/transforms/rescale.py @@ -72,10 +72,13 @@ class RescaleImages(object): Qt.IgnoreAspectRatio, Qt.SmoothTransformation) data = pixmap_to_data(img, format=ext) else: - im = im.resize((int(new_width), int(new_height)), PILImage.ANTIALIAS) - of = cStringIO.StringIO() - im.convert('RGB').save(of, ext) - data = of.getvalue() + try: + im = im.resize((int(new_width), int(new_height)), PILImage.ANTIALIAS) + of = cStringIO.StringIO() + im.convert('RGB').save(of, ext) + data = of.getvalue() + except: + self.log.exception('Failed to rescale image') if data is not None: item.data = data item.unload_data_from_memory() diff --git a/src/calibre/ebooks/pdb/pdf/reader.py b/src/calibre/ebooks/pdb/pdf/reader.py index 3ae9f8ccca..c151551866 100644 --- a/src/calibre/ebooks/pdb/pdf/reader.py +++ b/src/calibre/ebooks/pdb/pdf/reader.py @@ -21,7 +21,7 @@ class Reader(FormatReader): self.options = options setattr(self.options, 'new_pdf_engine', False) setattr(self.options, 'no_images', False) - setattr(self.options, 'unwrap_factor', 0.5) + setattr(self.options, 'unwrap_factor', 0.45) def extract_content(self, output_dir): self.log.info('Extracting PDF...') diff --git a/src/calibre/ebooks/pdf/input.py b/src/calibre/ebooks/pdf/input.py index 64a089281e..14b3552b04 100644 --- a/src/calibre/ebooks/pdf/input.py +++ b/src/calibre/ebooks/pdf/input.py @@ -22,10 +22,10 @@ class PDFInput(InputFormatPlugin): options = set([ OptionRecommendation(name='no_images', recommended_value=False, help=_('Do not extract images from the document')), - OptionRecommendation(name='unwrap_factor', recommended_value=0.5, + OptionRecommendation(name='unwrap_factor', recommended_value=0.45, help=_('Scale used to determine the length at which a line should ' 'be unwrapped. Valid values are a decimal between 0 and 1. The ' - 'default is 0.5, this is the median line length.')), + 'default is 0.45, just below the median line length.')), OptionRecommendation(name='new_pdf_engine', recommended_value=False, help=_('Use the new PDF conversion engine.')) ]) diff --git a/src/calibre/ebooks/rtf/input.py b/src/calibre/ebooks/rtf/input.py index 4c7dfd9260..ec6f9a04d3 100644 --- a/src/calibre/ebooks/rtf/input.py +++ b/src/calibre/ebooks/rtf/input.py @@ -7,7 +7,7 @@ import os, glob, re, textwrap from lxml import etree from calibre.customize.conversion import InputFormatPlugin -from calibre.ebooks.conversion.preprocess import line_length +from calibre.ebooks.conversion.utils import PreProcessor class InlineClass(etree.XSLTExtension): @@ -232,16 +232,8 @@ class RTFInput(InputFormatPlugin): res = transform.tostring(result) res = res[:100].replace('xmlns:html', 'xmlns') + res[100:] if self.options.preprocess_html: - self.log("********* Preprocessing HTML *********") - # Detect Chapters to match the xpath in the GUI - chapdetect = re.compile(r']*>\s*]*>\s*(?P(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(|)?)\s*\s*

', re.IGNORECASE) - res = chapdetect.sub('

'+'\g'+'

\n', res) - # Unwrap lines using punctation if the median length of all lines is less than 150 - length = line_length('html', res, 0.4) - self.log("*** Median length is " + str(length) + " ***") - unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*\s*(

)?\s*(?P]*>\s*(]*>\s*\s*)

\s*){0,3}\s*]*>\s*(]*>)?\s*" % length, re.UNICODE) - if length < 150: - res = unwrap.sub(' ', res) + preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + res = preprocessor(res) f.write(res) self.write_inline_css(inline_class) stream.seek(0) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 1b61404589..c0c7b0a9ed 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1,7 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ -import os, sys +import os, sys, Queue from threading import RLock from PyQt4.Qt import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, \ @@ -39,7 +39,7 @@ gprefs.defaults['action-layout-context-menu'] = ( 'Edit Metadata', 'Send To Device', 'Save To Disk', 'Connect Share', 'Copy To Library', None, 'Convert Books', 'View', 'Open Folder', 'Show Book Details', - 'Similar Books', None, 'Remove Books', + 'Similar Books', 'Tweak ePub', None, 'Remove Books', ) gprefs.defaults['action-layout-context-menu-device'] = ( @@ -50,6 +50,7 @@ gprefs.defaults['action-layout-context-menu-device'] = ( gprefs.defaults['show_splash_screen'] = True gprefs.defaults['toolbar_icon_size'] = 'medium' gprefs.defaults['toolbar_text'] = 'auto' +gprefs.defaults['show_child_bar'] = False # }}} @@ -295,6 +296,34 @@ class Dispatcher(QObject): def dispatch(self, args, kwargs): self.func(*args, **kwargs) +class FunctionDispatcher(QObject): + ''' + Convenience class to use Qt signals with arbitrary python functions. + By default, ensures that a function call always happens in the + thread this Dispatcher was created in. + ''' + dispatch_signal = pyqtSignal(object, object, object) + + def __init__(self, func, queued=True, parent=None): + QObject.__init__(self, parent) + self.func = func + typ = Qt.QueuedConnection + if not queued: + typ = Qt.AutoConnection if queued is None else Qt.DirectConnection + self.dispatch_signal.connect(self.dispatch, type=typ) + + def __call__(self, *args, **kwargs): + q = Queue.Queue() + self.dispatch_signal.emit(q, args, kwargs) + return q.get() + + def dispatch(self, q, args, kwargs): + try: + res = self.func(*args, **kwargs) + except: + res = None + q.put(res) + class GetMetadata(QObject): ''' Convenience class to ensure that metadata readers are used only in the @@ -574,18 +603,6 @@ class Application(QApplication): self._file_open_paths = [] self._file_open_lock = RLock() - if islinux: - self.setStyleSheet(''' - QToolTip { - border: 2px solid black; - padding: 5px; - border-radius: 10px; - opacity: 200; - background-color: #e1e1ff; - color: black; - } - ''') - def _send_file_open_events(self): with self._file_open_lock: if self._file_open_paths: diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index 57ad900fba..b2d1656367 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -71,6 +71,12 @@ class InterfaceAction(QObject): all_locations = frozenset(['toolbar', 'toolbar-device', 'context-menu', 'context-menu-device']) + #: Type of action + #: 'current' means acts on the current view + #: 'global' means an action that does not act on the current view, but rather + #: on calibre as a whole + action_type = 'global' + def __init__(self, parent, site_customization): QObject.__init__(self, parent) self.setObjectName(self.name) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index f0ff794fab..add7bf1d5b 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -25,6 +25,7 @@ class AddAction(InterfaceAction): action_spec = (_('Add books'), 'add_book.png', _('Add books to the calibre library/device from files on your computer') , _('A')) + action_type = 'current' def genesis(self): self._add_filesystem_book = self.Dispatcher(self.__add_filesystem_book) diff --git a/src/calibre/gui2/actions/add_to_library.py b/src/calibre/gui2/actions/add_to_library.py index 6fc0d5fb1f..05aea8f1dd 100644 --- a/src/calibre/gui2/actions/add_to_library.py +++ b/src/calibre/gui2/actions/add_to_library.py @@ -13,6 +13,7 @@ class AddToLibraryAction(InterfaceAction): action_spec = (_('Add books to library'), 'add_book.png', _('Add books to your calibre library from the connected device'), None) dont_add_to = frozenset(['toolbar', 'context-menu']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.add_books_to_library) diff --git a/src/calibre/gui2/actions/annotate.py b/src/calibre/gui2/actions/annotate.py index 5356d63e98..dfafcd1a39 100644 --- a/src/calibre/gui2/actions/annotate.py +++ b/src/calibre/gui2/actions/annotate.py @@ -18,6 +18,7 @@ class FetchAnnotationsAction(InterfaceAction): name = 'Fetch Annotations' action_spec = (_('Fetch annotations (experimental)'), None, None, None) + action_type = 'current' def genesis(self): pass diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index ee0f06ab71..29acfc52b1 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -21,6 +21,7 @@ class ConvertAction(InterfaceAction): name = 'Convert Books' action_spec = (_('Convert books'), 'convert.png', None, _('C')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): cm = QMenu() diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 7127c91e8c..6b7654f644 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -80,6 +80,7 @@ class CopyToLibraryAction(InterfaceAction): _('Copy selected books to the specified library'), None) popup_type = QToolButton.InstantPopup dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.menu = QMenu(self.gui) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 0343c6df84..406860e4ec 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -16,6 +16,7 @@ class DeleteAction(InterfaceAction): name = 'Remove Books' action_spec = (_('Remove books'), 'trash.png', None, _('Del')) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.delete_books) diff --git a/src/calibre/gui2/actions/edit_collections.py b/src/calibre/gui2/actions/edit_collections.py index e45d36fc62..7f5dd76538 100644 --- a/src/calibre/gui2/actions/edit_collections.py +++ b/src/calibre/gui2/actions/edit_collections.py @@ -13,6 +13,7 @@ class EditCollectionsAction(InterfaceAction): action_spec = (_('Manage collections'), None, _('Manage the collections on this device'), None) dont_add_to = frozenset(['toolbar', 'context-menu']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.edit_collections) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 878ba77a43..bd9728989b 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -22,6 +22,7 @@ class EditMetadataAction(InterfaceAction): name = 'Edit Metadata' action_spec = (_('Edit metadata'), 'edit_input.png', None, _('E')) + action_type = 'current' def genesis(self): self.create_action(spec=(_('Merge book records'), 'merge_books.png', @@ -172,6 +173,8 @@ class EditMetadataAction(InterfaceAction): ''' rows = [r.row() for r in \ self.gui.library_view.selectionModel().selectedRows()] + m = self.gui.library_view.model() + ids = [m.id(r) for r in rows] if not rows or len(rows) == 0: d = error_dialog(self.gui, _('Cannot edit metadata'), _('No books selected')) @@ -190,6 +193,7 @@ class EditMetadataAction(InterfaceAction): self.gui.tags_view.recount() if self.gui.cover_flow: self.gui.cover_flow.dataChanged() + self.gui.library_view.select_rows(ids) # Merge books {{{ def merge_books(self, safe_merge=False): diff --git a/src/calibre/gui2/actions/open.py b/src/calibre/gui2/actions/open.py index 106bfa24f6..141ff01a66 100644 --- a/src/calibre/gui2/actions/open.py +++ b/src/calibre/gui2/actions/open.py @@ -14,6 +14,7 @@ class OpenFolderAction(InterfaceAction): action_spec = (_('Open containing folder'), 'document_open.png', None, _('O')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.gui.iactions['View'].view_folder) diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index bfcc02e130..e9664b9980 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -38,6 +38,7 @@ class SaveToDiskAction(InterfaceAction): name = "Save To Disk" action_spec = (_('Save to disk'), 'save.png', None, _('S')) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.save_to_disk) diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index d17d0998f1..18b0a694bf 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -16,6 +16,7 @@ class ShowBookDetailsAction(InterfaceAction): action_spec = (_('Show book details'), 'dialog_information.png', None, _('I')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.show_book_info) diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index 1a14869a9c..644cd3160a 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -16,6 +16,7 @@ class SimilarBooksAction(InterfaceAction): name = 'Similar Books' action_spec = (_('Similar books...'), None, None, None) popup_type = QToolButton.InstantPopup + action_type = 'current' def genesis(self): m = QMenu(self.gui) diff --git a/src/calibre/gui2/actions/tweak_epub.py b/src/calibre/gui2/actions/tweak_epub.py new file mode 100755 index 0000000000..212aff8019 --- /dev/null +++ b/src/calibre/gui2/actions/tweak_epub.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from calibre.gui2 import error_dialog +from calibre.gui2.actions import InterfaceAction +from calibre.gui2.dialogs.tweak_epub import TweakEpub + +class TweakEpubAction(InterfaceAction): + + name = 'Tweak ePub' + action_spec = (_('Tweak ePub'), 'trim.png', + _('Make small changes to ePub format books'), + _('T')) + dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' + + def genesis(self): + self.qaction.triggered.connect(self.edit_epub_in_situ) + + def edit_epub_in_situ(self, *args): + row = self.gui.library_view.currentIndex() + if not row.isValid(): + return error_dialog(self.gui, _('Cannot tweak ePub'), + _('No book selected'), show=True) + + # Confirm 'EPUB' in formats + book_id = self.gui.library_view.model().id(row) + try: + path_to_epub = self.gui.library_view.model().db.format_abspath( + book_id, 'EPUB', index_is_id=True) + except: + path_to_epub = None + + if not path_to_epub: + return error_dialog(self.gui, _('Cannot tweak ePub'), + _('No ePub available. First convert the book to ePub.'), + show=True) + + # Launch modal dialog waiting for user to tweak or cancel + dlg = TweakEpub(self.gui, path_to_epub) + if dlg.exec_() == dlg.Accepted: + self.update_db(book_id, dlg._output) + dlg.cleanup() + + def update_db(self, book_id, rebuilt): + ''' + Update the calibre db with the tweaked epub + ''' + self.gui.library_view.model().db.add_format(book_id, 'EPUB', + open(rebuilt, 'rb'), index_is_id=True) + diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index 2f6be24e5b..0fbf86c567 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -22,6 +22,7 @@ class ViewAction(InterfaceAction): name = 'View' action_spec = (_('View'), 'view.png', None, _('V')) + action_type = 'current' def genesis(self): self.persistent_files = [] diff --git a/src/calibre/gui2/convert/look_and_feel.py b/src/calibre/gui2/convert/look_and_feel.py index b0403bf1dd..ec3f0b944d 100644 --- a/src/calibre/gui2/convert/look_and_feel.py +++ b/src/calibre/gui2/convert/look_and_feel.py @@ -22,7 +22,7 @@ class LookAndFeelWidget(Widget, Ui_Form): Widget.__init__(self, parent, ['change_justification', 'extra_css', 'base_font_size', 'font_size_mapping', 'line_height', - 'linearize_tables', + 'linearize_tables', 'smarten_punctuation', 'disable_font_rescaling', 'insert_blank_line', 'remove_paragraph_spacing', 'remove_paragraph_spacing_indent_size','input_encoding', 'asciiize', 'keep_ligatures'] diff --git a/src/calibre/gui2/convert/look_and_feel.ui b/src/calibre/gui2/convert/look_and_feel.ui index de48e7caf9..c683300854 100644 --- a/src/calibre/gui2/convert/look_and_feel.ui +++ b/src/calibre/gui2/convert/look_and_feel.ui @@ -178,7 +178,7 @@ - + Extra &CSS @@ -214,6 +214,13 @@ + + + + Smarten &punctuation + + + diff --git a/src/calibre/gui2/convert/pdf_input.ui b/src/calibre/gui2/convert/pdf_input.ui index 626c68ea63..b2ee421922 100644 --- a/src/calibre/gui2/convert/pdf_input.ui +++ b/src/calibre/gui2/convert/pdf_input.ui @@ -46,7 +46,7 @@ 0.010000000000000 - 0.500000000000000 + 0.450000000000000 diff --git a/src/calibre/gui2/convert/structure_detection.py b/src/calibre/gui2/convert/structure_detection.py index f2ca49d1bd..3f350d4508 100644 --- a/src/calibre/gui2/convert/structure_detection.py +++ b/src/calibre/gui2/convert/structure_detection.py @@ -26,8 +26,10 @@ class StructureDetectionWidget(Widget, Ui_Form): 'remove_first_image', 'insert_metadata', 'page_breaks_before', 'preprocess_html', 'remove_header', 'header_regex', - 'remove_footer', 'footer_regex'] + 'remove_footer', 'footer_regex','html_unwrap_factor'] ) + self.opt_html_unwrap_factor.setEnabled(False) + self.huf_label.setEnabled(False) self.db, self.book_id = db, book_id for x in ('pagebreak', 'rule', 'both', 'none'): self.opt_chapter_mark.addItem(x) @@ -64,3 +66,8 @@ class StructureDetectionWidget(Widget, Ui_Form): _('The XPath expression %s is invalid.')%x.text).exec_() return False return True + + def set_value_handler(self, g, val): + if val is None and g is self.opt_html_unwrap_factor: + g.setValue(0.0) + return True diff --git a/src/calibre/gui2/convert/structure_detection.ui b/src/calibre/gui2/convert/structure_detection.ui index eb2892a07a..21fe365e99 100644 --- a/src/calibre/gui2/convert/structure_detection.ui +++ b/src/calibre/gui2/convert/structure_detection.ui @@ -14,10 +14,10 @@ Form - + - + Chapter &mark: @@ -27,38 +27,31 @@ - + 20 - + Remove first &image - + Insert &metadata as page at start of book - - - - &Preprocess input file to possibly improve structure detection - - - - + - + Qt::Vertical @@ -71,26 +64,72 @@ - + Remove F&ooter - + Remove H&eader - + - + + + + + Line &un-wrap factor during preprocess: + + + opt_html_unwrap_factor + + + + + + + + + + 1.000000000000000 + + + 0.050000000000000 + + + 0.400000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Preprocess input file to possibly improve structure detection + + + @@ -108,5 +147,38 @@ - + + + opt_preprocess_html + toggled(bool) + opt_html_unwrap_factor + setEnabled(bool) + + + 328 + 87 + + + 481 + 113 + + + + + opt_preprocess_html + toggled(bool) + huf_label + setEnabled(bool) + + + 295 + 88 + + + 291 + 105 + + + + diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 88bbae6c41..cb951b09be 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -155,6 +155,7 @@ class CoverFlowMixin(object): self.cb_splitter.action_toggle.triggered.connect(self.toggle_cover_browser) if CoverFlow is not None: self.cover_flow.stop.connect(self.hide_cover_browser) + self.cover_flow.setVisible(False) else: self.cb_splitter.insertWidget(self.cb_splitter.side_index, self.cover_flow) if CoverFlow is not None: diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 45c78ce6da..a7e55c4619 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -627,12 +627,11 @@ class DeviceMixin(object): # {{{ def connect_to_folder(self): dir = choose_dir(self, 'Select Device Folder', _('Select folder to open as device')) - kls = FOLDER_DEVICE - self.device_manager.mount_device(kls=kls, kind='folder', path=dir) + if dir is not None: + self.device_manager.mount_device(kls=FOLDER_DEVICE, kind='folder', path=dir) def connect_to_itunes(self): - kls = ITUNES_ASYNC - self.device_manager.mount_device(kls=kls, kind='itunes', path=None) + self.device_manager.mount_device(kls=ITUNES_ASYNC, kind='itunes', path=None) # disconnect from both folder and itunes devices def disconnect_mounted_device(self): @@ -708,6 +707,10 @@ class DeviceMixin(object): # {{{ ''' Called when a device is connected to the computer. ''' + # This can happen as this function is called in a queued connection and + # the user could have yanked the device in the meantime + if connected and not self.device_manager.is_device_connected: + connected = False self.set_device_menu_items_state(connected) if connected: self.device_manager.get_device_information(\ @@ -746,6 +749,7 @@ class DeviceMixin(object): # {{{ if job.failed: self.device_job_exception(job) return + # set_books_in_library might schedule a sync_booklists job self.set_books_in_library(job.result, reset=True) mainlist, cardalist, cardblist = job.result self.memory_view.set_database(mainlist) @@ -790,12 +794,13 @@ class DeviceMixin(object): # {{{ self.device_manager.remove_books_from_metadata(paths, self.booklists()) model.paths_deleted(paths) - self.upload_booklists() # Force recomputation the library's ondevice info. We need to call # set_books_in_library even though books were not added because - # the deleted book might have been an exact match. - self.set_books_in_library(self.booklists(), reset=True) - self.book_on_device(None, None, reset=True) + # the deleted book might have been an exact match. Upload the booklists + # if set_books_in_library did not. + if not self.set_books_in_library(self.booklists(), reset=True): + self.upload_booklists() + self.book_on_device(None, reset=True) # We need to reset the ondevice flags in the library. Use a big hammer, # so we don't need to worry about whether some succeeded or not. self.refresh_ondevice_info(device_connected=True, reset_only=False) @@ -1231,7 +1236,7 @@ class DeviceMixin(object): # {{{ self.location_manager.update_devices(cp, fs, self.device_manager.device.icon) # reset the views so that up-to-date info is shown. These need to be - # here because the sony driver updates collections in sync_booklists + # here because some drivers update collections in sync_booklists self.memory_view.reset() self.card_a_view.reset() self.card_b_view.reset() @@ -1281,8 +1286,6 @@ class DeviceMixin(object): # {{{ self.device_manager.add_books_to_metadata(job.result, metadata, self.booklists()) - self.upload_booklists() - books_to_be_deleted = [] if memory and memory[1]: books_to_be_deleted = memory[1] @@ -1292,18 +1295,21 @@ class DeviceMixin(object): # {{{ # book already there with a different book. This happens frequently in # news. When this happens, the book match indication will be wrong # because the UUID changed. Force both the device and the library view - # to refresh the flags. - self.set_books_in_library(self.booklists(), reset=True) + # to refresh the flags. Set_books_in_library could upload the booklists. + # If it does not, then do it here. + if not self.set_books_in_library(self.booklists(), reset=True): + self.upload_booklists() self.book_on_device(None, reset=True) self.refresh_ondevice_info(device_connected = True) - view = self.card_a_view if on_card == 'carda' else self.card_b_view if on_card == 'cardb' else self.memory_view + view = self.card_a_view if on_card == 'carda' else \ + self.card_b_view if on_card == 'cardb' else self.memory_view view.model().resort(reset=False) view.model().research() for f in files: getattr(f, 'close', lambda : True)() - def book_on_device(self, id, format=None, reset=False): + def book_on_device(self, id, reset=False): ''' Return an indication of whether the given book represented by its db id is on the currently connected device. It returns a 5 element list. The @@ -1332,8 +1338,6 @@ class DeviceMixin(object): # {{{ self.book_db_id_cache.append(set()) for book in l: db_id = getattr(book, 'application_id', None) - if db_id is None: - db_id = book.db_id if db_id is not None: # increment the count of books on the device with this # db_id. @@ -1372,7 +1376,7 @@ class DeviceMixin(object): # {{{ try: db = self.library_view.model().db except: - return + return False # Build a cache (map) of the library, so the search isn't On**2 self.db_book_title_cache = {} self.db_book_uuid_cache = {} @@ -1467,10 +1471,13 @@ class DeviceMixin(object): # {{{ # Set author_sort if it isn't already asort = getattr(book, 'author_sort', None) if not asort and book.authors: - book.author_sort = self.library_view.model().db.author_sort_from_authors(book.authors) + book.author_sort = self.library_view.model().db.\ + author_sort_from_authors(book.authors) if update_metadata: if self.device_manager.is_device_connected: - self.device_manager.sync_booklists(None, booklists) + self.device_manager.sync_booklists( + Dispatcher(self.metadata_synced), booklists) + return update_metadata # }}} diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index de483720fc..2e5c7838ca 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -4,8 +4,10 @@ __copyright__ = '2008, Kovid Goyal ' '''Dialog to edit metadata in bulk''' from threading import Thread +import re from PyQt4.Qt import QDialog, QGridLayout +from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor @@ -83,7 +85,6 @@ class Worker(Thread): w.commit(self.ids) self.db.bulk_modify_tags(self.ids, add=add, remove=remove, notify=False) - self.db.clean() def run(self): try: @@ -101,6 +102,13 @@ class Worker(Thread): class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): + s_r_functions = { + '' : lambda x: x, + _('Lower Case') : lambda x: x.lower(), + _('Upper Case') : lambda x: x.upper(), + _('Title Case') : lambda x: x.title(), + } + def __init__(self, window, rows, db): QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) @@ -127,12 +135,193 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series.currentIndexChanged[int].connect(self.series_changed) self.series.editTextChanged.connect(self.series_changed) self.tag_editor_button.clicked.connect(self.tag_editor) + if len(db.custom_column_label_map) == 0: - self.central_widget.tabBar().setVisible(False) + self.central_widget.removeTab(1) else: self.create_custom_column_editors() + + self.prepare_search_and_replace() self.exec_() + def prepare_search_and_replace(self): + self.search_for.initialize('bulk_edit_search_for') + self.replace_with.initialize('bulk_edit_replace_with') + self.test_text.initialize('bulk_edit_test_test') + fields = [''] + fm = self.db.field_metadata + for f in fm: + if (f in ['author_sort'] or ( + fm[f]['datatype'] == 'text' or fm[f]['datatype'] == 'series') + and fm[f].get('search_terms', None) + and f not in ['formats', 'ondevice']): + fields.append(f) + fields.sort() + self.search_field.addItems(fields) + self.search_field.setMaxVisibleItems(min(len(fields), 20)) + offset = 10 + self.s_r_number_of_books = min(7, len(self.ids)) + for i in range(1,self.s_r_number_of_books+1): + w = QtGui.QLabel(self.tabWidgetPage3) + w.setText(_('Book %d:')%i) + self.gridLayout1.addWidget(w, i+offset, 0, 1, 1) + w = QtGui.QLineEdit(self.tabWidgetPage3) + w.setReadOnly(True) + name = 'book_%d_text'%i + setattr(self, name, w) + self.book_1_text.setObjectName(name) + self.gridLayout1.addWidget(w, i+offset, 1, 1, 1) + w = QtGui.QLineEdit(self.tabWidgetPage3) + w.setReadOnly(True) + name = 'book_%d_result'%i + setattr(self, name, w) + self.book_1_text.setObjectName(name) + self.gridLayout1.addWidget(w, i+offset, 2, 1, 1) + + self.s_r_heading.setText('

'+ + _('Search and replace in text fields using ' + 'regular expressions. 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. See ' + ' ' + 'this reference ' + 'for more information, and in particular the \'sub\' ' + 'function.') + '

' + _( + 'Note: you can destroy your library ' + 'using this feature. Changes are permanent. There ' + 'is no undo function. You are strongly encouraged ' + 'to back up your library before proceeding.')) + self.s_r_error = None + self.s_r_obj = None + + self.replace_func.addItems(sorted(self.s_r_functions.keys())) + self.search_field.currentIndexChanged[str].connect(self.s_r_field_changed) + self.replace_func.currentIndexChanged[str].connect(self.s_r_paint_results) + self.search_for.editTextChanged[str].connect(self.s_r_paint_results) + self.replace_with.editTextChanged[str].connect(self.s_r_paint_results) + self.test_text.editTextChanged[str].connect(self.s_r_paint_results) + self.central_widget.setCurrentIndex(0) + + def s_r_field_changed(self, txt): + txt = unicode(txt) + for i in range(0, self.s_r_number_of_books): + if txt: + fm = self.db.field_metadata[txt] + id = self.ids[i] + val = self.db.get_property(id, index_is_id=True, + loc=fm['rec_index']) + if val is None: + val = '' + if fm['is_multiple']: + val = [t.strip() for t in val.split(fm['is_multiple']) if t.strip()] + if val: + val.sort(cmp=lambda x,y: cmp(x.lower(), y.lower())) + val = val[0] + if txt == 'authors': + val = val.replace('|', ',') + else: + val = '' + else: + val = '' + w = getattr(self, 'book_%d_text'%(i+1)) + w.setText(val) + self.s_r_paint_results(None) + + def s_r_set_colors(self): + if self.s_r_error is not None: + col = 'rgb(255, 0, 0, 20%)' + self.test_result.setText(self.s_r_error.message) + else: + col = 'rgb(0, 255, 0, 20%)' + self.test_result.setStyleSheet('QLineEdit { color: black; ' + 'background-color: %s; }'%col) + for i in range(0,self.s_r_number_of_books): + getattr(self, 'book_%d_result'%(i+1)).setText('') + + def s_r_func(self, match): + rf = self.s_r_functions[unicode(self.replace_func.currentText())] + rv = unicode(self.replace_with.text()) + val = match.expand(rv) + return rf(val) + + def s_r_paint_results(self, txt): + self.s_r_error = None + self.s_r_set_colors() + try: + self.s_r_obj = re.compile(unicode(self.search_for.text())) + except re.error as e: + self.s_r_obj = None + self.s_r_error = e + self.s_r_set_colors() + return + + try: + self.test_result.setText(self.s_r_obj.sub(self.s_r_func, + unicode(self.test_text.text()))) + except re.error as e: + self.s_r_error = e + self.s_r_set_colors() + return + + for i in range(0,self.s_r_number_of_books): + wt = getattr(self, 'book_%d_text'%(i+1)) + wr = getattr(self, 'book_%d_result'%(i+1)) + try: + wr.setText(self.s_r_obj.sub(self.s_r_func, unicode(wt.text()))) + except re.error as e: + self.s_r_error = e + self.s_r_set_colors() + break + + def do_search_replace(self): + field = unicode(self.search_field.currentText()) + if not field or not self.s_r_obj: + return + + fm = self.db.field_metadata[field] + + def apply_pattern(val): + try: + return self.s_r_obj.sub(self.s_r_func, val) + except: + return val + + for id in self.ids: + val = self.db.get_property(id, index_is_id=True, + loc=fm['rec_index']) + if val is None: + continue + if fm['is_multiple']: + res = [] + for val in [t.strip() for t in val.split(fm['is_multiple'])]: + v = apply_pattern(val).strip() + if v: + res.append(v) + val = res + if fm['is_custom']: + # The standard tags and authors values want to be lists. + # All custom columns are to be strings + val = fm['is_multiple'].join(val) + elif field == 'authors': + val = [v.replace('|', ',') for v in val] + else: + val = apply_pattern(val) + + if fm['is_custom']: + extra = self.db.get_custom_extra(id, label=fm['label'], index_is_id=True) + self.db.set_custom(id, val, label=fm['label'], extra=extra, + commit=False) + else: + if field == 'comments': + setter = self.db.set_comment + else: + setter = getattr(self.db, 'set_'+field) + setter(id, val, notify=False, commit=False) + self.db.commit() + def create_custom_column_editors(self): w = self.central_widget.widget(1) layout = QGridLayout() @@ -193,6 +382,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): if len(self.ids) < 1: return QDialog.accept(self) + if self.s_r_error is not None: + error_dialog(self, _('Search/replace invalid'), + _('Search pattern is invalid: %s')%self.s_r_error.message, + show=True) + return False self.changed = bool(self.ids) # Cache values from GUI so that Qt widgets are not used in # non GUI thread @@ -234,6 +428,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): return error_dialog(self, _('Failed'), self.worker.error[0], det_msg=self.worker.error[1], show=True) + + self.do_search_replace() + + self.db.clean() return QDialog.accept(self) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 0eeee61c7e..aca7b0cb75 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -6,8 +6,8 @@ 0 0 - 526 - 499 + 679 + 685 @@ -200,14 +200,15 @@ - - Remove all - Check this box to remove all tags from the books. + + Remove all + - + + &Series: @@ -294,6 +295,19 @@ Future conversion of these books will use the default settings. + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -301,6 +315,131 @@ Future conversion of these books will use the default settings. &Custom metadata + + + &Search and replace (experimental) + + + + QLayout::SetMinimumSize + + + + + true + + + true + + + + + + + + + + + + + + Search &field: + + + search_field + + + + + + + &Search for: + + + search_for + + + + + + + &Replace with: + + + replace_with + + + + + + + + + + + + + + + + Apply function &after replace: + + + replace_func + + + + + + + + + + Test &text + + + test_text + + + + + + + Test re&sult + + + test_result + + + + + + + Your test: + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + @@ -333,6 +472,11 @@ Future conversion of these books will use the default settings. QLineEdit

widgets.h
+ + HistoryLineEdit + QLineEdit +
widgets.h
+
authors diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 3d79b01c14..6c57e30166 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -6,10 +6,7 @@ The dialog used to edit meta information for a book as well as add/remove formats ''' -import os -import re -import time -import traceback +import os, re, time, traceback, textwrap from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QThread, QDate, \ QPixmap, QListWidgetItem, QDialog, pyqtSignal @@ -303,6 +300,24 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.cpixmap = pix self.cover_data = cdata + def trim_cover(self, *args): + from calibre.utils.magick import Image + cdata = self.cover_data + if not cdata: + return + im = Image() + im.load(cdata) + im.trim(10) + cdata = im.export('jpg') + pix = QPixmap() + pix.loadFromData(cdata) + self.cover.setPixmap(pix) + self.cover_changed = True + self.cpixmap = pix + self.cover_data = cdata + + + def sync_formats(self): old_extensions, new_extensions, paths = set(), set(), {} for row in range(self.formats.count()): @@ -331,6 +346,14 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): ResizableDialog.__init__(self, window) self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter) self.cancel_all = False + base = unicode(self.author_sort.toolTip()) + self.ok_aus_tooltip = '

' + textwrap.fill(base+'

'+ + _(' The green color indicates that the current ' + 'author sort matches the current author')) + self.bad_aus_tooltip = '

'+textwrap.fill(base + '

'+ + _(' The red color indicates that the current ' + 'author sort does not match the current author')) + if cancel_all: self.__abort_button = self.button_box.addButton(self.button_box.Abort) self.__abort_button.setToolTip(_('Abort the editing of all remaining books')) @@ -375,6 +398,11 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.remove_unused_series) QObject.connect(self.auto_author_sort, SIGNAL('clicked()'), self.deduce_author_sort) + self.trim_cover_button.clicked.connect(self.trim_cover) + self.connect(self.author_sort, SIGNAL('textChanged(const QString&)'), + self.author_sort_box_changed) + self.connect(self.authors, SIGNAL('editTextChanged(const QString&)'), + self.authors_box_changed) self.connect(self.formats, SIGNAL('itemDoubleClicked(QListWidgetItem*)'), self.show_format) self.connect(self.formats, SIGNAL('delete_format()'), self.remove_format) @@ -467,6 +495,28 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): for c in range(2, len(ans[i].widgets), 2): w.setTabOrder(ans[i].widgets[c-1], ans[i].widgets[c+1]) + def authors_box_changed(self, txt): + aus = unicode(txt) + aus = re.sub(r'\s+et al\.$', '', aus) + aus = self.db.author_sort_from_authors(string_to_authors(aus)) + self.mark_author_sort(normal=(unicode(self.author_sort.text()) == aus)) + + def author_sort_box_changed(self, txt): + au = unicode(self.authors.text()) + au = re.sub(r'\s+et al\.$', '', au) + au = self.db.author_sort_from_authors(string_to_authors(au)) + self.mark_author_sort(normal=(au == txt)) + + def mark_author_sort(self, normal=True): + if normal: + col = 'rgb(0, 255, 0, 20%)' + else: + col = 'rgb(255, 0, 0, 20%)' + self.author_sort.setStyleSheet('QLineEdit { color: black; ' + 'background-color: %s; }'%col) + tt = self.ok_aus_tooltip if normal else self.bad_aus_tooltip + self.author_sort.setToolTip(tt) + def validate_isbn(self, isbn): isbn = unicode(isbn).strip() if not isbn: @@ -720,20 +770,22 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): try: if self.formats_changed: self.sync_formats() - title = unicode(self.title.text()) + title = unicode(self.title.text()).strip() self.db.set_title(self.id, title, notify=False) - au = unicode(self.authors.text()) + au = unicode(self.authors.text()).strip() if au: self.db.set_authors(self.id, string_to_authors(au), notify=False) - aus = unicode(self.author_sort.text()) + aus = unicode(self.author_sort.text()).strip() if aus: self.db.set_author_sort(self.id, aus, notify=False, commit=False) self.db.set_isbn(self.id, - re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())), + re.sub(r'[^0-9a-zA-Z]', '', + unicode(self.isbn.text()).strip()), notify=False, commit=False) self.db.set_rating(self.id, 2*self.rating.value(), notify=False, commit=False) - self.db.set_publisher(self.id, unicode(self.publisher.currentText()), + self.db.set_publisher(self.id, + unicode(self.publisher.currentText()).strip(), notify=False, commit=False) self.db.set_tags(self.id, [x.strip() for x in unicode(self.tags.text()).split(',')], notify=False, commit=False) @@ -742,7 +794,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): commit=False) self.db.set_series_index(self.id, self.series_index.value(), notify=False, commit=False) - self.db.set_comment(self.id, unicode(self.comments.toPlainText()), + self.db.set_comment(self.id, + unicode(self.comments.toPlainText()).strip(), notify=False, commit=False) d = self.pubdate.date() d = qt_to_dt(d) @@ -766,7 +819,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): fname = err.filename if err.filename else 'file' return error_dialog(self, _('Permission denied'), _('Could not open %s. Is it being used by another' - ' program?')%fname, show=True) + ' program?')%fname, det_msg=traceback.format_exc(), + show=True) raise self.save_state() QDialog.accept(self) diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 7184192eba..dbf825e706 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -151,14 +151,16 @@ - Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles. + Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles. +If the box is colored green, then text matches the individual author's sort strings. If it is colored red, then the authors and this text do not match. - Automatically create the author sort entry based on the current author entry + Automatically create the author sort entry based on the current author entry. +Using this button to create author sort will change author sort from red to green. ... @@ -623,6 +625,17 @@ + + + + Remove border (if any) from cover + + + + :/images/trim.png:/images/trim.png + + + diff --git a/src/calibre/gui2/dialogs/tweak_epub.py b/src/calibre/gui2/dialogs/tweak_epub.py new file mode 100755 index 0000000000..db6e93fd7a --- /dev/null +++ b/src/calibre/gui2/dialogs/tweak_epub.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai +from __future__ import with_statement + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import os, shutil +from contextlib import closing +from zipfile import ZipFile, ZIP_DEFLATED, ZIP_STORED + +from PyQt4.Qt import QDialog + +from calibre.gui2 import open_local_file +from calibre.gui2.dialogs.tweak_epub_ui import Ui_Dialog +from calibre.libunzip import extract as zipextract +from calibre.ptempfile import PersistentTemporaryDirectory + +class TweakEpub(QDialog, Ui_Dialog): + ''' + Display controls for tweaking ePubs + + ''' + + def __init__(self, parent, epub): + QDialog.__init__(self, parent) + + self._epub = epub + self._exploded = None + self._output = None + + # Run the dialog setup generated from tweak_epub.ui + self.setupUi(self) + + self.cancel_button.clicked.connect(self.reject) + self.explode_button.clicked.connect(self.explode) + self.rebuild_button.clicked.connect(self.rebuild) + + # Position update dialog overlaying top left of app window + parent_loc = parent.pos() + self.move(parent_loc.x(),parent_loc.y()) + + def cleanup(self): + # Delete directory containing exploded ePub + if self._exploded is not None: + shutil.rmtree(self._exploded, ignore_errors=True) + + + def display_exploded(self): + ''' + Generic subprocess launch of native file browser + User can use right-click to 'Open with ...' + ''' + open_local_file(self._exploded) + + def explode(self, *args): + if self._exploded is None: + self._exploded = PersistentTemporaryDirectory("_exploded", prefix='') + zipextract(self._epub, self._exploded) + self.display_exploded() + self.rebuild_button.setEnabled(True) + self.explode_button.setEnabled(False) + + def rebuild(self, *args): + self._output = os.path.join(self._exploded, 'rebuilt.epub') + with closing(ZipFile(self._output, 'w', compression=ZIP_DEFLATED)) as zf: + # Write mimetype + zf.write(os.path.join(self._exploded,'mimetype'), 'mimetype', compress_type=ZIP_STORED) + # Write everything else + exclude_files = ['.DS_Store','mimetype','iTunesMetadata.plist','rebuilt.epub'] + for root, dirs, files in os.walk(self._exploded): + for fn in files: + if fn in exclude_files: + continue + absfn = os.path.join(root, fn) + zfn = os.path.relpath(absfn, + self._exploded).replace(os.sep, '/') + zf.write(absfn, zfn) + return QDialog.accept(self) + diff --git a/src/calibre/gui2/dialogs/tweak_epub.ui b/src/calibre/gui2/dialogs/tweak_epub.ui new file mode 100644 index 0000000000..ccd33f44ab --- /dev/null +++ b/src/calibre/gui2/dialogs/tweak_epub.ui @@ -0,0 +1,87 @@ + + + Dialog + + + Qt::NonModal + + + + 0 + 0 + 382 + 242 + + + + Tweak ePub + + + false + + + false + + + + + + Display contents of exploded ePub + + + &Explode ePub + + + + :/images/wizard.png:/images/wizard.png + + + + + + + false + + + Rebuild ePub from exploded contents + + + &Rebuild ePub + + + + :/images/exec.png:/images/exec.png + + + + + + + Discard changes + + + &Cancel + + + + :/images/window-close.png:/images/window-close.png + + + + + + + Explode the ePub to display contents in a file browser window. To tweak individual files, right-click, then 'Open with...' your editor of choice. When tweaks are complete, close the file browser window. Rebuild the ePub, updating your calibre library. + + + true + + + + + + + + + + diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index 58d5267c8e..ec7e023dc1 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -61,7 +61,7 @@ class LocationManager(QObject): # {{{ ac('library', _('Library'), 'lt.png', _('Show books in calibre library')) - ac('main', _('Reader'), 'reader.png', + ac('main', _('Device'), 'reader.png', _('Show books in the main memory of the device')) ac('carda', _('Card A'), 'sd.png', _('Show books in storage card A')) @@ -197,11 +197,21 @@ class SearchBar(QWidget): # {{{ # }}} +class Spacer(QWidget): + + def __init__(self, parent): + QWidget.__init__(self, parent) + self.l = QHBoxLayout() + self.setLayout(self.l) + self.l.addStretch(10) + + class ToolBar(QToolBar): # {{{ - def __init__(self, donate, location_manager, parent): + def __init__(self, donate, location_manager, child_bar, parent): QToolBar.__init__(self, parent) self.gui = parent + self.child_bar = child_bar self.setContextMenuPolicy(Qt.PreventContextMenu) self.setMovable(False) self.setFloatable(False) @@ -223,16 +233,19 @@ class ToolBar(QToolBar): # {{{ sz = gprefs['toolbar_icon_size'] sz = {'small':24, 'medium':48, 'large':64}[sz] self.setIconSize(QSize(sz, sz)) + self.child_bar.setIconSize(QSize(sz, sz)) style = Qt.ToolButtonTextUnderIcon if gprefs['toolbar_text'] == 'never': style = Qt.ToolButtonIconOnly self.setToolButtonStyle(style) + self.child_bar.setToolButtonStyle(style) self.donate_button.set_normal_icon_size(sz, sz) def contextMenuEvent(self, *args): pass def build_bar(self): + self.child_bar.setVisible(gprefs['show_child_bar']) self.showing_donate = False showing_device = self.location_manager.has_device actions = '-device' if showing_device else '' @@ -244,10 +257,16 @@ class ToolBar(QToolBar): # {{{ m.setVisible(False) self.clear() + self.child_bar.clear() self.added_actions = [] + self.spacers = [Spacer(self.child_bar), Spacer(self.child_bar), + Spacer(self), Spacer(self)] + self.child_bar.addWidget(self.spacers[0]) + if gprefs['show_child_bar']: + self.addWidget(self.spacers[2]) for what in actions: - if what is None: + if what is None and not gprefs['show_child_bar']: self.addSeparator() elif what == 'Location Manager': for ac in self.location_manager.available_actions: @@ -262,12 +281,21 @@ class ToolBar(QToolBar): # {{{ self.showing_donate = True elif what in self.gui.iactions: action = self.gui.iactions[what] - self.addAction(action.qaction) + bar = self + if action.action_type == 'current' and gprefs['show_child_bar']: + bar = self.child_bar + bar.addAction(action.qaction) self.added_actions.append(action.qaction) self.setup_tool_button(action.qaction, action.popup_type) + self.child_bar.addWidget(self.spacers[1]) + if gprefs['show_child_bar']: + self.addWidget(self.spacers[3]) + def setup_tool_button(self, ac, menu_mode=None): ch = self.widgetForAction(ac) + if ch is None: + ch = self.child_bar.widgetForAction(ac) ch.setCursor(Qt.PointingHandCursor) ch.setAutoRaise(True) if ac.menu() is not None and menu_mode is not None: @@ -280,7 +308,8 @@ class ToolBar(QToolBar): # {{{ if p == 'never': style = Qt.ToolButtonIconOnly - if p == 'auto' and self.preferred_width > self.width()+35: + if p == 'auto' and self.preferred_width > self.width()+35 and \ + not gprefs['show_child_bar']: style = Qt.ToolButtonIconOnly self.setToolButtonStyle(style) @@ -309,9 +338,11 @@ class MainWindowMixin(object): # {{{ self.iactions['Fetch News'].init_scheduler(db) self.search_bar = SearchBar(self) + self.child_bar = QToolBar(self) self.tool_bar = ToolBar(self.donate_button, - self.location_manager, self) + self.location_manager, self.child_bar, self) self.addToolBar(Qt.TopToolBarArea, self.tool_bar) + self.addToolBar(Qt.BottomToolBarArea, self.child_bar) l = self.centralwidget.layout() l.addWidget(self.search_bar) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index c746a5aa56..53f701386b 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -12,7 +12,7 @@ from operator import attrgetter from PyQt4.Qt import QAbstractTableModel, Qt, pyqtSignal, QIcon, QImage, \ QModelIndex, QVariant, QDate -from calibre.gui2 import NONE, config, UNDEFINED_QDATE +from calibre.gui2 import NONE, config, UNDEFINED_QDATE, FunctionDispatcher from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import fmt_sidx, authors_to_string, string_to_authors from calibre.ptempfile import PersistentTemporaryFile @@ -151,7 +151,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.database_changed.emit(db) if self.cover_cache is not None: self.cover_cache.stop() - self.cover_cache = CoverCache(db) + self.cover_cache = CoverCache(db, FunctionDispatcher(self.db.cover)) self.cover_cache.start() def refresh_cover(event, ids): if event == 'cover' and self.cover_cache is not None: @@ -1027,7 +1027,9 @@ class DeviceBooksModel(BooksModel): # {{{ def resort(self, reset=True): if self.sorted_on: self.sort(self.column_map.index(self.sorted_on[0]), - self.sorted_on[1], reset=reset) + self.sorted_on[1], reset=False) + if reset: + self.reset() def columnCount(self, parent): if parent and parent.isValid(): diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index d67d286aeb..724454dccf 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -479,6 +479,36 @@ class BooksView(QTableView): # {{{ sm = self.selectionModel() sm.select(index, sm.ClearAndSelect|sm.Rows) + def select_rows(self, identifiers, using_ids=True, change_current=True, + scroll=True): + ''' + Select rows identified by identifiers. identifiers can be a set of ids, + row numbers or QModelIndexes. + ''' + selmode = self.selectionMode() + self.setSelectionMode(QAbstractItemView.MultiSelection) + try: + rows = set([x.row() if hasattr(x, 'row') else x for x in + identifiers]) + if using_ids: + rows = set([]) + identifiers = set(identifiers) + m = self.model() + for row in range(m.rowCount(QModelIndex())): + if m.id(row) in identifiers: + rows.add(row) + if rows: + row = list(sorted(rows))[0] + if change_current: + self.set_current_row(row, select=False) + if scroll: + self.scroll_to_row(row) + self.clearSelection() + for r in rows: + self.selectRow(r) + finally: + self.setSelectionMode(selmode) + def close(self): self._model.close() diff --git a/src/calibre/gui2/notify.py b/src/calibre/gui2/notify.py index 385fdd92b7..501f7007eb 100644 --- a/src/calibre/gui2/notify.py +++ b/src/calibre/gui2/notify.py @@ -28,12 +28,12 @@ class DBUSNotifier(Notifier): ICON = I('notify.png') - def __init__(self, server, path): + def __init__(self, server, path, interface): self.ok, self.err = True, None try: import dbus self.dbus = dbus - self._notify = dbus.SessionBus().get_object(server, path) + self._notify = dbus.Interface(dbus.SessionBus().get_object(server, path), interface) except Exception, err: self.ok = False self.err = str(err) @@ -43,7 +43,7 @@ class KDENotifier(DBUSNotifier): def __init__(self): DBUSNotifier.__init__(self, 'org.kde.VisualNotifications', - '/VisualNotifications') + '/VisualNotifications', 'org.kde.VisualNotifications') def __call__(self, body, summary=None, replaces_id=None, timeout=0): if replaces_id is None: @@ -62,7 +62,7 @@ class FDONotifier(DBUSNotifier): def __init__(self): DBUSNotifier.__init__(self, 'org.freedesktop.Notifications', - '/org/freedesktop/Notifications') + '/org/freedesktop/Notifications', 'org.freedesktop.Notifications') def __call__(self, body, summary=None, replaces_id=None, timeout=0): if replaces_id is None: diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index f30b2fddbb..10c2fcfe95 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -46,6 +46,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('use_roman_numerals_for_series_number', config) r('separate_cover_flow', config, restart_required=True) r('search_as_you_type', config) + r('show_child_bar', gprefs) choices = [(_('Small'), 'small'), (_('Medium'), 'medium'), (_('Large'), 'large')] diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index 7c6c736b24..1de55d51ef 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -173,6 +173,13 @@ + + + + &Split the toolbar into two toolbars + + + diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 519d533ff6..6c50a71b92 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -376,7 +376,7 @@ class TagsModel(QAbstractItemModel): # {{{ 'series' : QIcon(I('series.png')), 'formats' : QIcon(I('book.png')), 'publisher' : QIcon(I('publisher.png')), - 'rating' : QIcon(I('star.png')), + 'rating' : QIcon(I('rating.png')), 'news' : QIcon(I('news.png')), 'tags' : QIcon(I('tags.png')), ':custom' : QIcon(I('column.png')), diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 7a516bb4ff..2f0452a773 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -217,6 +217,10 @@ def fetch_scheduled_recipe(arg): if 'output_profile' in ps: recs.append(('output_profile', ps['output_profile'], OptionRecommendation.HIGH)) + if ps['output_profile'] == 'kindle': + recs.append(('no_inline_toc', True, + OptionRecommendation.HIGH)) + lf = load_defaults('look_and_feel') if lf.get('base_font_size', 0.0) != 0.0: recs.append(('base_font_size', lf['base_font_size'], diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index f40eed1fcd..f8d50d1cd2 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -38,6 +38,7 @@ from calibre.gui2.init import LibraryViewMixin, LayoutMixin from calibre.gui2.search_box import SearchBoxMixin, SavedSearchBoxMixin from calibre.gui2.search_restriction_mixin import SearchRestrictionMixin from calibre.gui2.tag_view import TagBrowserMixin +from calibre.utils.ordered_dict import OrderedDict class Listener(Thread): # {{{ @@ -97,7 +98,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ MainWindow.__init__(self, opts, parent) self.opts = opts self.device_connected = None - acmap = {} + acmap = OrderedDict() for action in interface_actions(): mod, cls = action.actual_plugin.split(':') ac = getattr(__import__(mod, fromlist=['1'], level=0), cls)(self, diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 4f795ab733..58edd89cb2 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, itertools +import re, itertools, time from itertools import repeat from datetime import timedelta from threading import Thread, RLock @@ -23,10 +23,11 @@ from calibre import fit_image class CoverCache(Thread): - def __init__(self, db): + def __init__(self, db, cover_func): Thread.__init__(self) self.daemon = True self.db = db + self.cover_func = cover_func self.load_queue = Queue() self.keep_running = True self.cache = {} @@ -37,7 +38,8 @@ class CoverCache(Thread): self.keep_running = False def _image_for_id(self, id_): - img = self.db.cover(id_, index_is_id=True, as_image=True) + time.sleep(0.050) # Limit 20/second to not overwhelm the GUI + img = self.cover_func(id_, index_is_id=True, as_image=True) if img is None: img = QImage() if not img.isNull(): @@ -589,9 +591,9 @@ class ResultCache(SearchQueryParser): if field not in self.field_metadata.iterkeys(): if field in ('author', 'tag', 'comment'): field += 's' - if field == 'date': field = 'timestamp' - elif field == 'title': field = 'sort' - elif field == 'authors': field = 'author_sort' + if field == 'date': field = 'timestamp' + elif field == 'title': field = 'sort' + elif field == 'authors': field = 'author_sort' return field def sort(self, field, ascending, subsort=False): diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index f8c857c819..2faab2eaa4 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -2528,6 +2528,10 @@ class EPUB_MOBI(CatalogPlugin): # Fetch the database as a dictionary self.booksBySeries = self.plugin.search_sort_db(self.db, self.opts) + if not self.booksBySeries: + self.opts.generate_series = False + self.opts.log(" no series found in selected books, cancelling series generation") + return friendly_name = "Series" @@ -2591,7 +2595,7 @@ class EPUB_MOBI(CatalogPlugin): aTag = Tag(soup, 'a') aTag['name'] = "%s_series" % re.sub('\W','',book['series']).lower() pSeriesTag.insert(0,aTag) - pSeriesTag.insert(1,NavigableString(self.NOT_READ_SYMBOL + '%s' % book['series'])) + pSeriesTag.insert(1,NavigableString('%s' % book['series'])) divTag.insert(dtc,pSeriesTag) dtc += 1 @@ -2600,7 +2604,14 @@ class EPUB_MOBI(CatalogPlugin): ptc = 0 # book with read/reading/unread symbol - if 'read' in book and book['read']: + for tag in book['tags']: + if tag == self.opts.read_tag: + book['read'] = True + break + else: + book['read'] = False + + if book['read']: # check mark pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) pBookTag['class'] = "read_book" diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 8a5ab75c3c..6a3ea9ba48 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -143,6 +143,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): SchemaUpgrade.__init__(self) self.initialize_dynamic() + def get_property(self, idx, index_is_id=False, loc=-1): + row = self.data._data[idx] if index_is_id else self.data[idx] + if row is not None: + return row[loc] + def initialize_dynamic(self): self.field_metadata = FieldMetadata() #Ensure we start with a clean copy self.prefs = DBPrefs(self) @@ -324,17 +329,12 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.last_update_check = self.last_modified() - def get_property(idx, index_is_id=False, loc=-1): - row = self.data._data[idx] if index_is_id else self.data[idx] - if row is not None: - return row[loc] - for prop in ('author_sort', 'authors', 'comment', 'comments', 'isbn', 'publisher', 'rating', 'series', 'series_index', 'tags', 'title', 'timestamp', 'uuid', 'pubdate', 'ondevice'): - setattr(self, prop, functools.partial(get_property, + setattr(self, prop, functools.partial(self.get_property, loc=self.FIELD_MAP['comments' if prop == 'comment' else prop])) - setattr(self, 'title_sort', functools.partial(get_property, + setattr(self, 'title_sort', functools.partial(self.get_property, loc=self.FIELD_MAP['sort'])) def initialize_database(self): @@ -358,10 +358,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return row[self.FIELD_MAP['path']].replace('/', os.sep) - def abspath(self, index, index_is_id=False): + def abspath(self, index, index_is_id=False, create_dirs=True): 'Return the absolute path to the directory containing this books files as a unicode string.' path = os.path.join(self.library_path, self.path(index, index_is_id=index_is_id)) - if not os.path.exists(path): + if create_dirs and not os.path.exists(path): os.makedirs(path) return path @@ -402,7 +402,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): path = path.lower() return path - def set_path(self, index, index_is_id=False, commit=True): + def set_path(self, index, index_is_id=False): ''' Set the path to the directory containing this books files based on its current title and author. If there was a previous directory, its contents @@ -432,17 +432,18 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if current_path and os.path.exists(spath): # Migrate existing files cdata = self.cover(id, index_is_id=True) if cdata is not None: - open(os.path.join(tpath, 'cover.jpg'), 'wb').write(cdata) + with open(os.path.join(tpath, 'cover.jpg'), 'wb') as f: + f.write(cdata) for format in formats: # Get data as string (can't use file as source and target files may be the same) f = self.format(id, format, index_is_id=True, as_file=False) if not f: continue stream = cStringIO.StringIO(f) - self.add_format(id, format, stream, index_is_id=True, path=tpath) + self.add_format(id, format, stream, index_is_id=True, + path=tpath, notify=False) self.conn.execute('UPDATE books SET path=? WHERE id=?', (path, id)) - if commit: - self.conn.commit() + self.conn.commit() self.data.set(id, self.FIELD_MAP['path'], path, row_is_id=True) # Delete not needed directories if current_path and os.path.exists(spath): @@ -451,6 +452,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): parent = os.path.dirname(spath) if len(os.listdir(parent)) == 0: self.rmtree(parent, permanent=True) + curpath = self.library_path c1, c2 = current_path.split('/'), path.split('/') if not self.is_case_sensitive and len(c1) == len(c2): @@ -465,13 +467,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # the directories, so no need to do them here. for oldseg, newseg in zip(c1, c2): if oldseg.lower() == newseg.lower() and oldseg != newseg: - while True: - # need a temp name in the current segment for renames - tempname = os.path.join(curpath, 'TEMP.%f'%time.time()) - if not os.path.exists(tempname): - break - os.rename(os.path.join(curpath, oldseg), tempname) - os.rename(tempname, os.path.join(curpath, newseg)) + try: + os.rename(os.path.join(curpath, oldseg), os.path.join(curpath, newseg)) + except: + break # Fail silently since nothing catastrophic has happened curpath = os.path.join(curpath, newseg) def add_listener(self, listener): @@ -597,8 +596,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return identical_book_ids def has_cover(self, index, index_is_id=False): - id = index if index_is_id else self.id(index) - path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') + id = index if index_is_id else self.id(index) + try: + path = os.path.join(self.abspath(id, index_is_id=True, + create_dirs=False), 'cover.jpg') + except: + # Can happen if path has not yet been set + return False return os.access(path, os.R_OK) def remove_cover(self, id, notify=True): @@ -609,6 +613,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): except (IOError, OSError): time.sleep(0.2) os.remove(path) + self.data.set(id, self.FIELD_MAP['cover'], False, row_is_id=True) if notify: self.notify('cover', [id]) @@ -629,6 +634,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): except (IOError, OSError): time.sleep(0.2) save_cover_data_to(data, path) + self.data.set(id, self.FIELD_MAP['cover'], True, row_is_id=True) if notify: self.notify('cover', [id]) @@ -715,7 +721,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): path = self.format_abspath(index, format, index_is_id=index_is_id) if path is not None: f = open(path, mode) - ret = f if as_file else f.read() + try: + ret = f if as_file else f.read() + except IOError: + f.seek(0) + out = cStringIO.StringIO() + shutil.copyfileobj(f, out) + ret = out.getvalue() if not as_file: f.close() return ret @@ -1087,8 +1099,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.set_path(id, True) self.notify('metadata', [id]) - # Given a book, return the list of author sort strings for the book's authors def authors_sort_strings(self, id, index_is_id=False): + ''' + Given a book, return the list of author sort strings + for the book's authors + ''' id = id if index_is_id else self.id(id) aut_strings = self.conn.get(''' SELECT sort @@ -1119,9 +1134,12 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): result.append(r) return ' & '.join(result).replace('|', ',') - def set_authors(self, id, authors, notify=True): + def set_authors(self, id, authors, notify=True, commit=True): ''' - `authors`: A list of authors. + Note that even if commit is False, the db will still be committed to + because this causes the location of files to change + + :param authors: A list of authors. ''' if not authors: authors = [_('Unknown')] @@ -1147,16 +1165,21 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ss = self.author_sort_from_book(id, index_is_id=True) self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (ss, id)) - self.conn.commit() + if commit: + self.conn.commit() self.data.set(id, self.FIELD_MAP['authors'], ','.join([a.replace(',', '|') for a in authors]), row_is_id=True) self.data.set(id, self.FIELD_MAP['author_sort'], ss, row_is_id=True) - self.set_path(id, True) + self.set_path(id, index_is_id=True) if notify: self.notify('metadata', [id]) - def set_title(self, id, title, notify=True): + def set_title(self, id, title, notify=True, commit=True): + ''' + Note that even if commit is False, the db will still be committed to + because this causes the location of files to change + ''' if not title: return if not isinstance(title, unicode): @@ -1167,8 +1190,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.data.set(id, self.FIELD_MAP['sort'], title_sort(title), row_is_id=True) else: self.data.set(id, self.FIELD_MAP['sort'], title, row_is_id=True) - self.set_path(id, True) - self.conn.commit() + self.set_path(id, index_is_id=True) + if commit: + self.conn.commit() if notify: self.notify('metadata', [id]) @@ -1744,10 +1768,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): series_index = 1.0 if mi.series_index is None else mi.series_index aus = mi.author_sort if mi.author_sort else self.author_sort_from_authors(mi.authors) title = mi.title - if isinstance(aus, str): + if isbytestring(aus): aus = aus.decode(preferred_encoding, 'replace') - if isinstance(title, str): - title = title.decode(preferred_encoding) + if isbytestring(title): + title = title.decode(preferred_encoding, 'replace') obj = self.conn.execute('INSERT INTO books(title, series_index, author_sort) VALUES (?, ?, ?)', (title, series_index, aus)) id = obj.lastrowid diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py index ecb467b4c2..9e2f0cb2a2 100644 --- a/src/calibre/library/server/content.py +++ b/src/calibre/library/server/content.py @@ -56,7 +56,7 @@ class ContentServer(object): def sort(self, items, field, order): field = self.db.data.sanitize_sort_field_name(field) - if field not in ('title', 'authors', 'rating', 'timestamp', 'tags', 'size', 'series'): + if field not in self.db.field_metadata.field_keys(): raise cherrypy.HTTPError(400, '%s is not a valid sort field'%field) keyg = CSSortKeyGenerator([(field, order)], self.db.field_metadata) items.sort(key=keyg, reverse=not order) @@ -123,8 +123,6 @@ class ContentServer(object): return self.static('index.html') - - # Actually get content from the database {{{ def get_cover(self, id, thumbnail=False): cover = self.db.cover(id, index_is_id=True, as_file=False) @@ -184,7 +182,7 @@ class ContentServer(object): if path and os.path.exists(path): updated = fromtimestamp(os.stat(path).st_mtime) cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) - return fmt.read() + return fmt # }}} diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index 229e0c21c4..cde245431f 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -18,6 +18,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.constants import __appname__ from calibre import human_readable from calibre.utils.date import utcfromtimestamp, format_date +from calibre.utils.filenames import ascii_filename def CLASS(*args, **kwargs): # class is a reserved word in Python kwargs['class'] = ' '.join(args) @@ -110,11 +111,13 @@ def build_index(books, num, search, sort, order, start, total, url_base, CKEYS): data = TD() last = None for fmt in book['formats'].split(','): + a = ascii_filename(book['authors']) + t = ascii_filename(book['title']) s = SPAN( A( fmt.lower(), - href='/get/%s/%s-%s_%d.%s' % (fmt, book['authors'], - book['title'], book['id'], fmt) + href='/get/%s/%s-%s_%d.%s' % (fmt, a, t, + book['id'], fmt) ), CLASS('button')) s.tail = u'\u202f' #   diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index ed8479980e..41fcfd8a93 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -16,6 +16,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.constants import preferred_encoding from calibre import isbytestring from calibre.utils.date import format_date +from calibre.utils.filenames import ascii_filename E = ElementMaker() @@ -88,6 +89,8 @@ class XMLServer(object): y = format_tag_string(y, ',') kwargs[x] = serialize(y) if y else '' + kwargs['safe_title'] = ascii_filename(kwargs['title']) + c = kwargs.pop('comments') CFM = self.db.field_metadata diff --git a/src/calibre/manual/conversion.rst b/src/calibre/manual/conversion.rst index c8bc3ef665..cfc2871396 100644 --- a/src/calibre/manual/conversion.rst +++ b/src/calibre/manual/conversion.rst @@ -329,6 +329,17 @@ There are a few more options in this section. of as a separate cover. If you also specify a cover in |app|, then the converted book will have two covers. This option will simply remove the first image from the source document, thereby ensuring that the converted book has only one cover, the one specified in |app|. + +:guilabel:`Preprocess input` + This option activates various algorithms that try to detect and correct common cases of + badly formatted input documents. Things like hard line breaks, large blocks of text with no formatting, etc. + Turn this option on if your input document suffers from bad formatting. But be aware that in + some cases, this option can lead to worse results, so use with care. + +:guilabel:`Line-unwrap factor` + This option control the algorithm |app| uses to remove hard line breaks. For example, if the value of this + option is 0.4, that means calibre will remove hard line breaks from the end of lines whose lengths are less + than the length of 40% of all lines in the document. Table of Contents ------------------ diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index b93444f4c3..beea30acb2 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -81,7 +81,7 @@ Device Integration What devices does |app| support? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -At the moment |app| has full support for the SONY PRS 300/500/505/600/700/900, Barnes & Noble Nook, Cybook Gen 3/Opus, Amazon Kindle 1/2/3/DX/DXG, Entourage Edge, Longshine ShineBook, Ectaco Jetbook, BeBook/BeBook Mini, Irex Illiad/DR1000, Foxit eSlick, PocketBook 360, Italica, eClicto, Iriver Story, Airis dBook, Hanvon N515, Binatone Readme, Teclast K3, SpringDesign Alex, Kobo Reader, various Android phones and the iPhone/iPad. In addition, using the :guilabel:`Save to disk` function you can use it with any ebook reader that exports itself as a USB disk. +At the moment |app| has full support for the SONY PRS line, Barnes & Noble Nook, Cybook Gen 3/Opus, Amazon Kindle line, Entourage Edge, Longshine ShineBook, Ectaco Jetbook, BeBook/BeBook Mini, Irex Illiad/DR1000, Foxit eSlick, PocketBook 360, Italica, eClicto, Iriver Story, Airis dBook, Hanvon N515, Binatone Readme, Teclast K3, SpringDesign Alex, Kobo Reader, various Android phones and the iPhone/iPad. In addition, using the :guilabel:`Save to disk` function you can use it with any ebook reader that exports itself as a USB disk. How can I help get my device supported in |app|? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -376,7 +376,9 @@ be printed to it. If the debug output contains a line that looks like:: then the problem is probably a corrupted font cache. You can clear the cache by following these `instructions `_. If that doesn't -solve it, look for a corrupted font file on your system, in ~/Library/Fonts or the like. +solve it, look for a corrupted font file on your system, in ~/Library/Fonts or the like. An easy way to +check for corrupted fonts in OS X is to start the "Font Book" application, select all fonts and then in the File +menu, choose "Validate fonts". My antivirus program claims |app| is a virus/trojan? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index 2538d0a304..132ff46156 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: 2010-09-05 23:43+0000\n" -"PO-Revision-Date: 2010-09-06 05:21+0000\n" +"POT-Creation-Date: 2010-09-17 21:00+0000\n" +"PO-Revision-Date: 2010-09-17 22:37+0000\n" "Last-Translator: Hsn \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: 2010-09-07 04:46+0000\n" +"X-Launchpad-Export-Date: 2010-09-18 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -24,11 +24,11 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:395 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -78,7 +78,9 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:173 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:39 @@ -101,43 +103,43 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:144 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:213 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 #: /home/kovid/work/calibre/src/calibre/library/database2.py:375 #: /home/kovid/work/calibre/src/calibre/library/database2.py:387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1057 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1126 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1825 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1827 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1954 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1065 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 @@ -171,16 +173,16 @@ msgstr "كاتب دليل المعلومات" msgid "Catalog generator" msgstr "مولد الكاتالوج" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:369 msgid "User Interface Action" msgstr "واجهة المستخدم" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:386 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:273 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "التفضيلات" @@ -258,161 +260,162 @@ msgstr "ضبط دليل المعلومات في الملفات %s" msgid "Set metadata from %s files" msgstr "ضبط دليل المعلومات من ملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 msgid "Look and Feel" msgstr "المظهر" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 msgid "Interface" msgstr "الواجهة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Behavior" msgstr "سلوك" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:705 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "اضف عامودك الخاص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:716 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Customize the toolbar" msgstr "خصِّص شريط الأدوات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 -msgid "Input Options" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +msgid "Input Options" +msgstr "خيارات الإدخال" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:739 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Common Options" msgstr "خيارات متداولة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:761 -msgid "Adding books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +msgid "Adding books" +msgstr "إضافة كتب" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 msgid "Import/Export" msgstr "إستيراد/تصدير" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Saving books to disk" -msgstr "" +msgstr "حفظ الكتب على القرص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "Sending books to devices" -msgstr "" +msgstr "ارسال الكتب الى الاجهزة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 -msgid "Sharing books by email" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 -msgid "Sharing" -msgstr "" +msgid "Sharing books by email" +msgstr "مشاركة الكتب عبر البريد الالكتروني" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +msgid "Sharing" +msgstr "مشاركة" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Sharing over the net" -msgstr "" +msgstr "المشاركة على الشبكة العنكبوتية" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 msgid "Plugins" msgstr "الملحقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 msgid "Advanced" msgstr "متقدّم" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Miscellaneous" -msgstr "" +msgstr "متفرقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Miscellaneous advanced configuration" msgstr "" @@ -456,7 +459,7 @@ msgstr "" "وثيقة الإدخال." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:414 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:418 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -468,62 +471,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:453 msgid "This profile is intended for the SONY PRS-900." msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:483 msgid "This profile is intended for the Microsoft Reader." msgstr "هذا الطور يستخدم مع Microsoft Reader" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:490 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 msgid "This profile is intended for the Mobipocket books." msgstr "ملف التعريف هذا يستخدم مع كتب Mobipocket ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:503 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:507 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "ملف التعريف هذا يستخدم مع Hanlin V3 وأمثاله." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:515 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:519 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "ملف التعريف هذا يستخدم مع Hanlin V5 وأمثاله." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:523 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:527 msgid "This profile is intended for the Cybook G3." msgstr "ملف التعريف هذا يستخدم مع Cybook G3" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:540 msgid "This profile is intended for the Cybook Opus." msgstr "ملف التعريف هذا يستخدم مع Cybook Opus ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:547 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:551 msgid "This profile is intended for the Amazon Kindle." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:584 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 msgid "This profile is intended for the Irex Illiad." msgstr "ملف التعريف هذا يستخدم مع Irex Illiad ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:602 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "ملف التعريف هذا يستخدم مع IRex Digital Reader 1000 ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:611 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:616 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:625 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 msgid "This profile is intended for the B&N Nook." msgstr "ملف التعريف هذا يستخدم مع B&N Nook ." @@ -540,24 +543,24 @@ msgstr "" "ملف التعريف هذا يحاول تقديم افتراضات عاقلة و مفيدة إذا كنت ترغب في إصدار " "وثيقة للقراءة في جهاز الكمبيوتر أو على مجموعة من الأجهزة." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:262 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:431 msgid "This profile is intended for the Kobo Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "This profile is intended for the SONY PRS-300." msgstr "ملف التعريف هذا يستخدم مع سوني PRS-300 ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:458 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the 5-inch JetBook." msgstr "ملف التعريف هذا يستخدم مع الخمسة بوصة JetBook ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:471 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -565,7 +568,7 @@ msgstr "" "ملف التعريف هذا يستخدم مع سوني خط إنتاج PRS . الـ500/505/700 الخ ، في وضع " "أفقي.غالباً مفيد للكاريكاتيرات." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:566 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:571 msgid "This profile is intended for the Amazon Kindle DX." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle DX" @@ -587,7 +590,7 @@ msgstr "ملحقات معطلة" #: /home/kovid/work/calibre/src/calibre/customize/ui.py:38 msgid "Enabled plugins" -msgstr "" +msgstr "تفعيل الاضافات" #: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 msgid "No valid plugin found in " @@ -647,15 +650,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 msgid "Communicate with S60 phones." -msgstr "" +msgstr "تواصل معا هواتف S60." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:85 +msgid "Apple device" +msgstr "جهاز أبل" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 msgid "Communicate with iTunes/iBooks." -msgstr "" +msgstr "التواصل عن طريق iTunes/iBooks." #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 msgid "Apple device detected, launching iTunes, please wait ..." -msgstr "" +msgstr "تم الكشف عن جهاز ابل, يتم تشغيل iTunes, الرجاء الانتظار..." #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 @@ -664,16 +671,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2861 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:922 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2831 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2871 msgid "%d of %d" msgstr "%d من %d" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:369 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2867 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:967 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2877 msgid "finished" msgstr "تم" @@ -698,19 +705,27 @@ msgid "" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2491 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2499 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:823 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:851 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:192 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:205 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1694 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:198 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:211 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "الأخبار" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +msgid "Catalog" +msgstr "الفهرس" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2738 msgid "Communicate with iTunes." msgstr "تواصل معا iTunes" @@ -850,14 +865,20 @@ msgstr "" msgid "Communicate with the Kindle DX eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle DX ." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:23 msgid "Communicate with the Kobo Reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:47 +msgid "" +"The Kobo supports only one collection currently: the \"Im_Reading\" list. " +"Create a tag called \"Im_Reading\" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -867,33 +888,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "يجري إحصاء قائمة كتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "يجري حذف الكتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "غير مطبق" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -919,6 +940,10 @@ msgstr "" msgid "Communicate with the Pandigital Novel" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the GM2000" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "التواصل مع نوكيا 770" @@ -959,7 +984,7 @@ msgstr "" "ضع علامة الفاصلة للفصل بين مجموعة من البيانات الوصفية لكي تكون مجموعة في " "الجهاز . و تشمل الاحتمالات التالية: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "بلا اسم" @@ -980,6 +1005,10 @@ msgstr "" msgid "Communicate with the iPapyrus reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59 +msgid "Communicate with the Sovos reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "لم يتمكن من كشف القرص %s. حاول إعادة التشغيل." @@ -1556,28 +1585,43 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367 +msgid "" +"Scale used to determine the length at which a line should be unwrapped if " +"preprocess is enabled. Valid values are a decimal between 0 and 1. The " +"default is 0.40, just below the median line length. This will unwrap typical " +"books with hard line breaks, but should be reduced if the line length is " +"variable." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:376 +msgid "" +"Convert plain quotes, dashes and ellipsis to their typographically correct " +"equivalents. For details, see http://daringfireball.net/projects/smartypants" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:384 msgid "Use a regular expression to try and remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:391 msgid "The regular expression to use to remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:397 msgid "Use a regular expression to try and remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:404 msgid "The regular expression to use to remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:411 msgid "" "Read metadata from the specified OPF file. Metadata read from this file will " "override any metadata in the source file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:418 msgid "" "Transliterate unicode characters to an ASCII representation. Use with care " "because this will replace unicode characters with ASCII. For instance it " @@ -1587,7 +1631,7 @@ msgid "" "number of people will be used (Chinese in the previous example)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:433 msgid "" "Preserve ligatures present in the input document. A ligature is a special " "rendering of a pair of characters like ff, fi, fl et cetera. Most readers do " @@ -1597,101 +1641,101 @@ msgid "" "instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:454 msgid "The version of the title to be used for sorting. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "String to be used when sorting by author. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "Set the cover to the specified file or URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68 msgid "Set the tags for the book. Should be a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:477 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:481 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 msgid "Set the publication date." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:606 msgid "Could not find an ebook inside the archive" msgstr "لم يتمكّن من الحصول على كتاب داخل الأرشيف" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:664 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:671 msgid "Failed to parse date/time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:826 msgid "Converting input to HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:853 msgid "Running transforms on ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:940 msgid "Creating" msgstr "" @@ -2073,8 +2117,8 @@ 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:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "العنوان" @@ -2082,8 +2126,8 @@ msgstr "العنوان" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "المؤلف أو المؤلفون" @@ -2105,28 +2149,30 @@ msgstr "المنتج" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1081 msgid "Comments" msgstr "التعليقات" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1075 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1077 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:145 msgid "Tags" msgstr "الوسوم" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1086 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:93 msgid "Series" msgstr "السلسلة" @@ -2135,11 +2181,12 @@ msgid "Language" msgstr "اللغة" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 msgid "Timestamp" msgstr "ختم التوقيت" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" @@ -2375,7 +2422,7 @@ msgid "" "LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1227 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Cover" msgstr "الغلاف" @@ -2486,12 +2533,18 @@ msgstr "النصّ الرئيسي" msgid "%s format books are not supported" msgstr "الكتب بتهيئة %s ليست مدعومة" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 +msgid "Book %s of %s" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54 msgid "HTML TOC generation options." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:113 -msgid "Book Jacket" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +msgid "Rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 @@ -2555,8 +2608,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:26 msgid "" "Scale used to determine the length at which a line should be unwrapped. " -"Valid values are a decimal between 0 and 1. The default is 0.5, this is the " -"median line length." +"Valid values are a decimal between 0 and 1. The default is 0.45, just below " +"the median line length." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30 @@ -2837,130 +2890,130 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 msgid "Confirm before deleting" msgstr "تأكيد قبل الحذف" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 msgid "Notify when a new version is available" msgstr "Notify when a new version is available" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 msgid "Defaults for conversion to LRF" msgstr "الإفتراضي للتحويل إلى LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 msgid "Options for the LRF ebook viewer" msgstr "الخيارات لمستعرض كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 msgid "Formats that are viewed using the internal viewer" msgstr "تهيئات التي تعرض عن طريق المستعرض الداخلي" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Show system tray icon" msgstr "إظهار أيقونة صينية النظام" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Upload downloaded news to device" msgstr "رفع أخبار تم تنزيلها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 msgid "Delete books from library after uploading to device" msgstr "حذف كتب من المكتبة بعد رفعها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 msgid "Choose Files" msgstr "" @@ -2976,127 +3029,127 @@ msgstr "" msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "Add books from a single directory" msgstr "إضافة كتب من دليل واحد" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 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:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 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:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:45 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:201 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "EPUB Books" msgstr "كتب EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "LRF Books" msgstr "كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "HTML Books" msgstr "كتب HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "LIT Books" msgstr "كتب LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "MOBI Books" msgstr "كتب MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Text books" msgstr "كتب نصّية" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "PDF Books" msgstr "كتب PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Comics" msgstr "الرسومات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Archives" msgstr "أرشيفات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 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:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "No book files found" msgstr "" @@ -3113,89 +3166,89 @@ msgstr "" msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:236 msgid "Use library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:237 msgid "User annotations generated from main library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:65 msgid "No books selected to fetch annotations from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:90 msgid "Merging user annotations into database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:118 msgid "%s
Last Page Read: %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:124 msgid "%s
Last Page Read: Location %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:143 msgid "Location %d • %s
%s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:152 msgid "Page %d • %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:157 msgid "Location %d • %s
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:34 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 msgid "Select destination for %s.%s" msgstr "" @@ -3246,38 +3299,48 @@ msgstr "" msgid "The folder %s already exists. Delete it first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +msgid "Rename failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:185 +msgid "" +"Failed to rename the library at %s. The most common cause for this is if one " +"of the files in the library is open in another program." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:195 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 msgid "Are you sure?" msgstr "هل أنت متأكّد؟" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:196 msgid "All files from %s will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:216 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:217 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:250 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:255 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3289,19 +3352,19 @@ msgstr "C" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 msgid "Cannot convert" msgstr "لا يمكن تحويله" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:115 msgid "Starting conversion of %d book(s)" msgstr "" @@ -3313,34 +3376,34 @@ msgstr "" msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:141 msgid "Copied %d books to %s" msgstr "" @@ -3352,82 +3415,82 @@ msgstr "Del" msgid "Remove books" msgstr "حذف كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:24 msgid "Remove selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:26 msgid "Remove files of a specific format from selected books.." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:29 msgid "Remove all formats from selected books, except..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:32 msgid "Remove covers from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:35 msgid "Remove matching books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:53 msgid "Cannot delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:66 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:84 msgid "Choose formats not to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 msgid "Main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Storage Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 msgid "Storage Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 msgid "No books to delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:123 msgid "None of the selected books are on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:195 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:161 msgid "" "The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" -msgstr "الكتب المختارة سوف تحذف تماماً من حاسوبك. هل أنت متأكّد؟" +"from your calibre library. Are you sure?" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:180 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -3492,79 +3555,79 @@ msgstr "E" msgid "Edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:29 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:31 msgid "Edit metadata individually" msgstr "تحرير الميتاداتا فردياً" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:34 msgid "Edit metadata in bulk" msgstr "تحرير الميتاداتا جملةً" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:37 msgid "Download metadata and covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:40 msgid "Download only metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:42 msgid "Download only covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:45 msgid "Download only social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:51 msgid "Merge into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:54 msgid "Merge into first selected book - keep others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 msgid "social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:105 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 msgid "Failed to download some metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:127 msgid "Failed to download metadata for the following:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130 msgid "Failed to download metadata:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:131 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:607 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:112 @@ -3572,39 +3635,40 @@ msgstr "" msgid "Error" msgstr "خطأ" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:177 msgid "Cannot edit metadata" msgstr "لا يمكن تحرير الميتاداتا" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:202 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." +"Book formats and metadata from the selected books will be added to the " +"first selected book. ISBN will not be merged.

The " +"second and subsequently selected books will not be deleted or " +"changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" +"Book formats and metadata from the selected books will be merged into the " +"first selected book. ISBN will not be merged.

After " +"merger the second and subsequently selected books will be deleted. " +"

All book formats of the first selected book will be kept and any " +"duplicate formats in the second and subsequently selected books will be " +"permanently deleted from your computer.

Are you sure " +"you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -3684,53 +3748,53 @@ msgid "S" msgstr "S" #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:46 msgid "Save to disk" msgstr "حفظ إلى القرص" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48 msgid "Save to disk in a single directory" msgstr "حفظ إلى القرص في دليل واحد" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:69 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:72 msgid "Save only %s format to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:94 msgid "Choose destination directory" msgstr "إختيار دليل الوجهة" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:102 msgid "" "You are trying to save files into the calibre library. This can cause " "corruption of your library. Save to disk is meant to export files from your " "calibre library elsewhere." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 msgid "Error while saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:137 msgid "There was an error while saving." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:143 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 msgid "Could not save some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:146 msgid "Click the show details button to see which ones." msgstr "" @@ -3742,11 +3806,11 @@ msgstr "" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:27 msgid "No detailed information is available for books on the device." msgstr "" @@ -3754,35 +3818,35 @@ msgstr "" msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Alt+A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 msgid "Books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Alt+Shift+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Books with the same tags" msgstr "كتب بنفس الوسوم" @@ -3791,29 +3855,29 @@ msgid "V" msgstr "V" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 msgid "View" msgstr "عرض" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:33 msgid "View specific format" msgstr "عرض تهيئة معينة" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 msgid "" "You are attempting to open %d books. Opening too many books at once can be " "slow and have a negative effect on the responsiveness of your computer. Once " @@ -3821,11 +3885,11 @@ msgid "" "continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 msgid "%s has no available formats." msgstr "" @@ -3850,7 +3914,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:804 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 msgid "No books" msgstr "" @@ -3969,19 +4033,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 #: /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:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -4044,8 +4108,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1065 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Path" msgstr "المسار" @@ -4055,15 +4119,15 @@ msgstr "المسار" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:307 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Formats" msgstr "التهيئات" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:891 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1070 msgid "Collections" msgstr "" @@ -4073,11 +4137,11 @@ msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1080 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4128,14 +4192,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66 @@ -4145,7 +4209,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:45 @@ -4153,14 +4217,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 @@ -4249,30 +4313,23 @@ msgstr "" msgid "E-book options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:550 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1657 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 -msgid "Catalog" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 msgid "'Don't include this book' tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 msgid "'Mark this book as read' tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 msgid "Additional note tag prefix:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4281,18 +4338,22 @@ msgid "" "Genre Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 msgid "Include 'Titles' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +msgid "Include 'Series' Section" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 msgid "Tab template for catalog.ui" msgstr "" @@ -4304,11 +4365,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 msgid "Bulk Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -4505,15 +4566,15 @@ msgid "&Base font size:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Font size &key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 @@ -4564,69 +4625,73 @@ msgstr "" msgid "Justify text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 msgid "&Disable font size rescaling" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 msgid "Base &font size:" msgstr "حجم الخط& الأساسي:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Line &height:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Input character &encoding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid "Remove &spacing between paragraphs" msgstr "حذف الفراغات& بين الفقرات" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 msgid "" "

When calibre removes inter paragraph spacing, it automatically sets a " "paragraph indent, to ensure that paragraphs can be easily distinguished. " "This option controls the width of that indent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "Text justification:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid "&Linearize tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Extra &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Insert &blank line" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "Keep &ligatures" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +msgid "Smarten &punctuation" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" @@ -4692,38 +4757,38 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "إختار الغلاف لـ " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "لا يمكن القراءة" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "خطأ في قراءة الملف" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

There was an error reading from file:
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " ليست صورة صالحة" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 msgid "Book Cover" msgstr "غلاف الكتاب" @@ -4732,7 +4797,7 @@ msgid "Use cover from &source file" msgstr "استخدم غلاف من المصدر&" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Change &cover image:" msgstr "تغيير صورة الغلاف&:" @@ -4751,7 +4816,7 @@ msgid "Change the title of this book" msgstr "تغيير عنوان هذا الكتاب" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Author(s): " msgstr "ال&مؤلف: " @@ -4767,19 +4832,19 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "&Publisher: " msgstr "&الناشر: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "Ta&gs: " msgstr "الو&سوم: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -4788,22 +4853,22 @@ msgstr "" "مجموعة كلمات، مفرقة بفاصلة." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "&Series:" msgstr "&سلسلات:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "List of known series. You can add new series." msgstr "قائمة السلسلات المعروفة. بإمكانك إضافة سلسلات جديدة." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "Book " msgstr "الكتاب " @@ -4962,7 +5027,7 @@ msgid "Regex:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Test" msgstr "تجربة" @@ -5000,66 +5065,70 @@ msgid "" "Fine tune the detection of chapter headings and other document structure." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:37 msgid "Detect chapters at (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 msgid "Insert page breaks before (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:40 msgid "Header regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:43 msgid "Footer regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39 msgid "Invalid XPath" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:40 msgid "The XPath expression %s is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:81 msgid "Chapter &mark:" msgstr "ع&لامة الفصل:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:82 msgid "Remove first &image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:83 msgid "Insert &metadata as page at start of book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64 -msgid "&Preprocess input file to possibly improve structure detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:84 msgid "Remove F&ooter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:85 msgid "Remove H&eader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 +msgid "Line &un-wrap factor during preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 +msgid "&Preprocess input file to possibly improve structure detection" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16 msgid "" "Table of\n" @@ -5281,7 +5350,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 msgid "Automatically number books in this series" msgstr "" @@ -5383,142 +5452,142 @@ msgstr "" msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 msgid "Error talking to device" msgstr "خطأ في الاتصال بالجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 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:717 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid "Device: " msgstr "الجهاز: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 msgid " detected." msgstr " تم كشفه." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:820 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:887 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:917 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1080 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:944 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 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:1270 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1271 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -5572,7 +5641,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 msgid "Generate catalog" msgstr "" @@ -5713,14 +5782,14 @@ 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:889 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 msgid "Date" 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:1064 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1066 msgid "Format" msgstr "التهيئة" @@ -5849,90 +5918,133 @@ msgstr "" msgid "Stop &all non device jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +msgid "Lower Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +msgid "Upper Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +msgid "Title Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:119 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:166 +msgid "Book %d:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:182 +msgid "" +"Search and replace in text fields using regular expressions. 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. See this " +"reference for more information, and in particular the 'sub' function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 +msgid "" +"Note: you can destroy your library using this feature. Changes are " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +msgid "Search/replace invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +msgid "Search pattern is invalid: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 msgid "Edit Meta information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 msgid "A&utomatically set author sort" msgstr "ضبط& ترتيب المؤلف آلياً" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 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:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid " stars" msgstr " نجمة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Open Tag Editor" msgstr "فتح محرر الوسوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 msgid "&Remove tags:" msgstr "حذف& الوسوم:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "Comma separated list of tags to remove from the books. " msgstr "قائمة من الوسوم مفرقة بالفاصلة لحذفها من الكتب. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 -msgid "Remove all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +msgid "Remove all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 msgid "Remove &format:" msgstr "حذف الت&هيئة:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -5940,161 +6052,205 @@ 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:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 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:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:199 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +msgid "Apply function &after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +msgid "Test &text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +msgid "Test re&sult" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +msgid "Your test:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +msgid "&Search and replace (experimental)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:133 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:150 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:169 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:200 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:223 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:229 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:240 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:295 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:296 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +msgid "" +" The green color indicates that the current author sort matches the current " +"author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +msgid "" +" The red color indicates that the current author sort does not match the " +"current author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:586 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:591 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:598 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 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:759 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -6114,76 +6270,87 @@ msgstr "" msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "" -"Automatically create the author sort entry based on the current author entry" -msgstr "ينشئ مدخل ترتيب المؤلف حسب مدخل المؤلف الحالي" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles.\n" +"If the box is colored green, then text matches the individual author's sort " +"strings. If it is colored red, then the authors and this text do not match." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +msgid "" +"Automatically create the author sort entry based on the current author " +"entry.\n" +"Using this button to create author sort will change author sort from red to " +"green." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "Remove unused series (Series that have no books)" msgstr "حذف سلسلات غير مستخدمة (سلسلات التي لا تحتوي على كتب)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Available Formats" msgstr "التهيئات المتوفرة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Remove the selected formats for this book from the database." msgstr "حذف التهيئات المختارة لهذا الكتاب من قاعدة البيانات." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 -msgid "Download &cover" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "&Generate cover" msgstr "" @@ -6488,12 +6655,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:80 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 msgid "Authors" msgstr "المؤلفون" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:113 msgid "Publishers" msgstr "الناشرون" @@ -6614,12 +6781,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -6675,7 +6842,7 @@ msgid "Send test mail from %s to:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 msgid "&Test" msgstr "&تجربة" @@ -6855,7 +7022,7 @@ msgstr "" msgid "Recipe source code (python)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 msgid "" "\n" @@ -6879,27 +7046,27 @@ msgid "" "metadata entries are documented in tooltips.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 msgid "Regular &expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121 msgid "File &name:" msgstr "اسم ال&ملف:" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:123 msgid "Title:" msgstr ":العنوان" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:124 msgid "Regular expression (?P<title>)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:103 @@ -6908,82 +7075,82 @@ msgstr "" msgid "No match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:126 msgid "Authors:" msgstr "المؤلفون:" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:127 msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:129 msgid "Series:" msgstr "السلسلة:" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:130 msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:132 msgid "Series index:" msgstr "فهرس السلسلة:" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:133 msgid "Regular expression (?P)" msgstr "Regular expression (?P)" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:135 msgid "ISBN:" msgstr "ISBN:" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:136 msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:100 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 msgid "Shift+Alt+B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:121 msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:142 +#: /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:157 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 msgid "Connected " msgstr "متصل " -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:172 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:209 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219 msgid "Shift+Alt+D" msgstr "" @@ -7064,7 +7231,7 @@ msgid "Show books in calibre library" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 -msgid "Reader" +msgid "Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 @@ -7072,7 +7239,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:648 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:656 msgid "Card A" msgstr "" @@ -7081,7 +7248,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:650 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:658 msgid "Card B" msgstr "" @@ -7140,78 +7307,74 @@ msgstr "" msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -msgid "Rating" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1086 msgid "Book %s of %s." msgstr "كتاب %s لـ%s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:679 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1182 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1184 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:881 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:885 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1164 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1167 msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:114 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:135 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:137 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:137 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:157 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -7242,7 +7405,7 @@ msgid "No matches for the search phrase %s were found." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:433 msgid "No matches found" msgstr "" @@ -7434,7 +7597,7 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:36 msgid "" "Restore settings to default values. You have to click Apply to actually save " "the default settings." @@ -7580,15 +7743,15 @@ msgstr "" msgid "Use internal &viewer for:" msgstr "استخدم المستعرض& الداخلي في:" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:96 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:101 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:103 msgid "Do you really want to delete column %s and all its data?" msgstr "" @@ -7818,125 +7981,135 @@ msgstr "" msgid "Wide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Medium" msgstr "متوسط" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Small" msgstr "صغير" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 msgid "Large" msgstr "كبير" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Always" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Automatic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 msgid "Never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 msgid "Choose &language (requires restart):" msgstr "إختر ال&لغة (يحتاج إعادة تشغيل):" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 msgid "Show &average ratings in the tags browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 msgid "Disable all animations. Useful if you have a slow/old computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 msgid "Disable &animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:113 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:114 msgid "Disable ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:115 msgid "Use &Roman numerals for series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:116 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:117 msgid "Search as you type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:118 msgid "&Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:119 msgid "&Icon size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:120 msgid "Show &text under icons:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:121 +msgid "&Split the toolbar into two toolbars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 msgid "&Cancel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 msgid "Save changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 msgid "Cancel and return to overview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 -msgid "Restart needed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 msgid "" "Some of the changes you made require a restart. Please restart calibre as " "soon as possible." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:297 +msgid "" +"The changes you have made require calibre be restarted immediately. You will " +"not be allowed set any more preferences, until you restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 +msgid "Restart needed" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:49 msgid "Checking database integrity" msgstr "" @@ -8365,7 +8538,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:50 msgid "" "Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" +"calibre. Your changes will only take effect after a restart of calibre." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:51 @@ -8509,53 +8682,53 @@ msgstr "" msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:435 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:304 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:770 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:774 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:773 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:779 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:779 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:785 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:784 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:789 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:788 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:791 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -8588,11 +8761,11 @@ msgstr "" msgid "Fetch news from " msgstr "احصل على الأخبار من " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" @@ -8655,7 +8828,7 @@ msgstr "" msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -8828,7 +9001,7 @@ msgid "Options to customize the ebook viewer" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:687 msgid "Remember last used window size" msgstr "" @@ -8968,88 +9141,92 @@ msgstr "" msgid "Book format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 msgid "Position in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:193 msgid "Go to a reference. To get reference numbers, use the reference mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:201 msgid "Search for text in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:270 msgid "Print Preview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:301 msgid "Connecting to dict.org to lookup: %s…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:400 msgid "Choose ebook" msgstr "إختيار الكتاب الإلكتروني" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:401 msgid "Ebooks" msgstr "كتب إلكترونية" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:419 -msgid "Add bookmark" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:419 -msgid "Enter title for bookmark:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:434 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:471 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:507 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:538 +msgid "Bookmark #%d" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:542 +msgid "Add bookmark" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:543 +msgid "Enter title for bookmark:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:590 msgid "Loading ebook..." msgstr "يتم تحميل الكتاب الإلكتروني..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:598 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:599 msgid "

This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:603 msgid "Could not open ebook" msgstr "لم يتمكن من فتح الكتاب الإلكتروني" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:677 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:684 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:689 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "" "%prog [options] file\n" "\n" @@ -9144,22 +9321,10 @@ msgstr "" msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 -msgid "Upper Case" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 -msgid "Lower Case" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 -msgid "Title Case" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:857 msgid "Drag to resize" msgstr "" @@ -9440,48 +9605,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:404 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:414 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:404 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:414 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:407 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:417 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:407 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:417 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 msgid "empty" msgstr "" @@ -9502,7 +9667,7 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:206 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:212 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -9511,7 +9676,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:216 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -9519,7 +9684,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:225 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:231 msgid "" "Create a citation for BibTeX entries.\n" "Boolean value: True, False\n" @@ -9527,7 +9692,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:234 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:240 msgid "" "The template for citation creation from database fields.\n" " Should be a template with {} enclosed fields.\n" @@ -9536,7 +9701,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:244 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:250 msgid "" "BibTeX file encoding output.\n" "Available types: utf8, cp1252, ascii.\n" @@ -9544,7 +9709,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:253 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:259 msgid "" "BibTeX file encoding flag.\n" "Available types: strict, replace, ignore, backslashreplace.\n" @@ -9552,7 +9717,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:262 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268 msgid "" "Entry type for BibTeX catalog.\n" "Available types: book, misc, mixed.\n" @@ -9560,14 +9725,14 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:530 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:536 msgid "" "Title of generated catalog used as title in metadata.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:537 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:543 msgid "" "Save the output from different stages of the conversion pipeline to the " "specified directory. Useful if you are unsure at which stage of the " @@ -9576,14 +9741,14 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:553 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[]'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:553 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:559 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -9592,28 +9757,35 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:561 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:567 msgid "" "Include 'Titles' section in catalog.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:568 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:574 +msgid "" +"Include 'Series' section in catalog.\n" +"Default: '%default'\n" +"Applies to: ePub, MOBI output formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:581 msgid "" "Include 'Recently Added' section in catalog.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:575 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:588 msgid "" "Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:582 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:595 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -9622,7 +9794,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:589 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:602 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -9632,7 +9804,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:596 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:609 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" @@ -9757,7 +9929,7 @@ msgstr "" msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:330 msgid "" "%prog remove ids\n" "\n" @@ -9766,11 +9938,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:344 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:345 msgid "You must specify at least one book to remove" msgstr "يجب أن تخصص على الأقل كتاباً واحداً للحذف" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:363 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:364 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -9779,15 +9951,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:378 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:379 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -9797,11 +9969,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:408 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:409 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:426 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:427 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -9811,15 +9983,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:434 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:435 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:443 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:444 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:456 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:458 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -9832,11 +10004,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:472 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:474 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:492 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:494 msgid "" "%prog export [options] ids\n" "\n" @@ -9847,27 +10019,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:500 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:502 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:502 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:504 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:504 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:506 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:513 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:534 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:536 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:547 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:549 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -9878,23 +10050,23 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:556 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:558 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:560 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:562 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:573 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:575 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:631 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:636 msgid "" "\n" " %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options]\n" @@ -9905,30 +10077,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:645 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:650 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:649 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:654 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:655 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:668 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:673 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:722 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -9940,17 +10112,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:733 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:732 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:744 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:763 msgid "" "\n" " %prog custom_columns [options]\n" @@ -9959,19 +10131,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:782 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:772 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:784 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:790 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -9981,15 +10153,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:798 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:808 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:803 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:818 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -10002,39 +10174,39 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:836 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:829 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:844 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:830 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:845 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:836 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:851 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:844 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:859 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:851 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:866 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:880 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -10060,35 +10232,35 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:646 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1980 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2009 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2026 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2119 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2160 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2182 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 msgid "Checked id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:122 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:124 msgid "Ratings" msgstr "" @@ -10514,7 +10686,7 @@ msgstr "" msgid "Failed to authenticate with server: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:229 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:230 msgid "Control email delivery" msgstr "" @@ -10527,29 +10699,29 @@ msgid "Unknown feed" msgstr "تلقيم مجهول" #: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:158 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:185 msgid "Untitled article" msgstr "مقالة بدون عنوان" -#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:21 +#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:22 msgid "Download periodical content from the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:36 +#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:37 msgid "" "Useful for recipe development. Forces max_articles_per_feed to 2 and " "downloads at most 2 feeds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:39 +#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:40 msgid "Username for sites that require a login to access content." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:42 +#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:43 msgid "Password for sites that require a login to access content." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:47 msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" @@ -10558,93 +10730,93 @@ msgstr "" msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:609 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 msgid "Download finished" msgstr "تم التنزيل" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 msgid "Failed to download the following articles:" msgstr "فشل تنزيل المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid "Failed to download parts of the following articles:" msgstr "فشل تنزيل أجزاء من المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 msgid " from " msgstr " من " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:809 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:830 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 msgid "Trying to download cover..." msgstr "محاولة تنزيل الغلاف..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:924 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:940 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 msgid "Feeds downloaded to %s" msgstr "تم تنزيل التلقيم إلى %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:950 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 msgid "Could not download cover: %s" msgstr "لم يتمكّن من تنزيل الغلاف: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 msgid "Downloading cover from %s" msgstr "يتم تنزيل الغلاف من %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1003 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 msgid "Untitled Article" msgstr "مقالة بدون عنوان" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 msgid "Article downloaded: %s" msgstr "المقالة منزّلة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 msgid "Article download failed: %s" msgstr "فشل تنزيل المقالة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1434 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." @@ -11203,6 +11375,10 @@ msgstr "" #~ msgid "Sort by &popularity" #~ msgstr "ترتيب حسب الش&هرة" +#~ msgid "" +#~ "Automatically create the author sort entry based on the current author entry" +#~ msgstr "ينشئ مدخل ترتيب المؤلف حسب مدخل المؤلف الحالي" + #~ msgid "Automatic &Table of Contents" #~ msgstr "قائمة المحتويات& المنشئة آلياً" @@ -11243,6 +11419,11 @@ msgstr "" #~ msgid "Remove &first image from source file" #~ msgstr "حذف الصورة الأو&لى من ملف المصدر" +#~ msgid "" +#~ "The selected books will be permanently deleted and the files removed " +#~ "from your computer. Are you sure?" +#~ msgstr "الكتب المختارة سوف تحذف تماماً من حاسوبك. هل أنت متأكّد؟" + #~ msgid "Insert &blank lines between paragraphs" #~ msgstr "إدخال سطر فارغ& بين الفقرات" diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 926cd2de6b..97e0005161 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,28 +10,28 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-09-03 19:17+0000\n" -"PO-Revision-Date: 2010-09-03 18:37+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-09-17 21:00+0000\n" +"PO-Revision-Date: 2010-09-23 09:05+0000\n" +"Last-Translator: oscarl \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: 2010-09-04 04:37+0000\n" +"X-Launchpad-Export-Date: 2010-09-24 04:39+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 msgid "Does absolutely nothing" -msgstr "No en fa absolutament res" +msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:395 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -81,7 +81,9 @@ msgstr "No en fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:173 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:39 @@ -104,43 +106,43 @@ msgstr "No en fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:144 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:213 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 #: /home/kovid/work/calibre/src/calibre/library/database2.py:375 #: /home/kovid/work/calibre/src/calibre/library/database2.py:387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1057 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1126 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1825 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1827 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1954 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1065 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 @@ -174,15 +176,17 @@ msgstr "Escriptor de metainformació" msgid "Catalog generator" msgstr "Generador del Catàleg" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:369 msgid "User Interface Action" -msgstr "" +msgstr "Acció d'interfície d'usuari" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:386 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "Preferències" @@ -201,7 +205,7 @@ msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." msgstr "" -"El joc de caràcters dels fitxer HTML d'entrada. Les opcions comuns inclouen: " +"Joc de caràcters dels fitxer HTML d'entrada. Les opcions comuns inclouen: " "cp1252, latin1, iso-8859-1 i utf-8." #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 @@ -260,19 +264,180 @@ msgstr "Estableix la metainformació als fitxers %s" msgid "Set metadata from %s files" msgstr "Estableix metainformació des dels fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 msgid "Look and Feel" -msgstr "" +msgstr "Aspecte i comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:683 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 msgid "Interface" -msgstr "" +msgstr "Interfície" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -msgid "Behavior" +msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" +"Ajusta l'aspecte i el comportament de la interfície de calibre per tal que " +"s'adapti al teu gust" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +msgid "Behavior" +msgstr "Comportament" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +msgid "Change the way calibre behaves" +msgstr "Canvia el comportament de calibre" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 +msgid "Add your own columns" +msgstr "Afegeix les teves columnes" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +msgid "Add/remove your own columns to the calibre book list" +msgstr "Afegeix/elimina les teves columnes a la llista de llibres de calibre" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +msgid "Customize the toolbar" +msgstr "Personalitza la barra d'eines" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "" +"Personalitza les barres d'eines i els menús de context, canviant quines " +"accions estan disponibles" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +msgid "Input Options" +msgstr "Opcions d'entrada" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +msgid "Conversion" +msgstr "Conversió" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +msgid "Set conversion options specific to each input format" +msgstr "" +"Ajusta les opcions de conversió específiques per a cada format d'entrada" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +msgid "Common Options" +msgstr "Opcions comunes" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +msgid "Set conversion options common to all formats" +msgstr "Ajusta les opcions de conversió comunes a tots els formats" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +msgid "Output Options" +msgstr "Opcions de sortida" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +msgid "Set conversion options specific to each output format" +msgstr "" +"Ajusta les opcions de conversió específiques de cada format de sortida" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +msgid "Adding books" +msgstr "Afegint llibres" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +msgid "Import/Export" +msgstr "Importa/exporta" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +msgid "Control how calibre reads metadata from files when adding books" +msgstr "" +"Controla com calibre llegeix les metadades dels arxius quan s'afegeixen " +"llibres" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +msgid "Saving books to disk" +msgstr "Desant els llibres al disc" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +msgid "" +"Control how calibre exports files from its database to disk when using Save " +"to disk" +msgstr "" +"Controla com calibre exporta arxius de la seva base de dades al disc quan " +"s'utilitza Desa al disc" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +msgid "Sending books to devices" +msgstr "Enviant llibres als dispositius" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "Controla com calibre envia arxius al teu lector d'ebooks" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +msgid "Sharing books by email" +msgstr "Compartint llibres via correu electrònic" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +msgid "Sharing" +msgstr "Compartint" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +msgid "" +"Setup sharing of books via email. Can be used for automatic sending of " +"downloaded news to your devices" +msgstr "" +"Configura compartir llibres via correu electrònic. Es pot utilitzar per " +"enviar notícies descarregades als teus dispositius" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +msgid "Sharing over the net" +msgstr "Compartint en xarxa" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +msgid "" +"Setup the calibre Content Server which will give you access to your calibre " +"library from anywhere, on any device, over the internet" +msgstr "" +"Configura el Servidor de Continguts que et donarà accés a la teva llibreria " +"des de qualsevol lloc i dispositiu, a través d'internet" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +msgid "Plugins" +msgstr "Plugins" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +msgid "Advanced" +msgstr "Avançat" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" +"Afegeix/eliminina/personalitza diversos bits de la funcionalitat de calibre" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +msgid "Tweaks" +msgstr "Ajustos" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "" +"Configuració detallada del comportament de calibre en diversos contextos" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +msgid "Miscellaneous" +msgstr "Miscel·lània" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +msgid "Miscellaneous advanced configuration" +msgstr "Configuració avançada" #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" @@ -316,7 +481,7 @@ msgstr "" "sabeu res del document d'entrada." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:414 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:418 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -328,62 +493,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Aquest perfil és adient per al SONY PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:453 msgid "This profile is intended for the SONY PRS-900." msgstr "Aquest perfil és adient per al SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:483 msgid "This profile is intended for the Microsoft Reader." msgstr "Aquest perfil és adient per al Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:490 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 msgid "This profile is intended for the Mobipocket books." msgstr "Aquest perfil és adient per a llibres Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:503 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:507 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Aquest perfil és adient per al Hanlin V3 i els seus clons." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:515 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:519 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Aquest perfil és adient per al Hanlin V5 i els seus clons." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:523 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:527 msgid "This profile is intended for the Cybook G3." msgstr "Aquest perfil és adient per al Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:540 msgid "This profile is intended for the Cybook Opus." msgstr "Aquest perfil és adient per al Cybook Opus" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:547 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:551 msgid "This profile is intended for the Amazon Kindle." msgstr "Aquest perfil és adient per a l'Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:584 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 msgid "This profile is intended for the Irex Illiad." msgstr "Aquest perfil és adient per a l'Irex Illiad" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:602 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Aquest perfil és adient per al IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:611 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:616 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Aquest perfil és adient per al IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:625 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 msgid "This profile is intended for the B&N Nook." msgstr "Aquest perfil és adient per al B&N Nook." @@ -401,25 +566,25 @@ msgstr "" "si voleu generar un document que es pugui llegir en un PC o en un conjunt " "ampli de dispositius diferents." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:262 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Destinats als dispositius d'IPAD i similars amb una resolució de 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:431 msgid "This profile is intended for the Kobo Reader." msgstr "Aquest perfil és adient per al lector Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "This profile is intended for the SONY PRS-300." msgstr "Aquest perfil és adient per al SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:458 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the 5-inch JetBook." msgstr "Aquest perfil és adient per al 5-inch JetBook" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:471 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -427,7 +592,7 @@ msgstr "" "Aquest perfil és adient per al la línia PRS de SONY. Els models 500/505/700, " "etc., en mode apaïsat. Sobretot és útil per als còmics." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:566 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:571 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Aquest perfil és adient per a l'Amazon Kindle DX." @@ -519,6 +684,10 @@ msgstr "" msgid "Communicate with S60 phones." msgstr "Estableix comunicació amb els telèfons S60." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:85 +msgid "Apple device" +msgstr "Dispositiu Apple" + #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 msgid "Communicate with iTunes/iBooks." msgstr "Comunicar-se amb iTunes/iBooks." @@ -534,16 +703,16 @@ msgstr "Actualitzant la llista de metadades del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2861 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:922 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2831 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2871 msgid "%d of %d" msgstr "%d de %d" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:369 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2867 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:967 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2877 msgid "finished" msgstr "finalitzat" @@ -573,19 +742,27 @@ msgstr "" "Varies portades no s'han pogut convertir.\n" "Clic a 'Veure Detalls' per a més informació." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2491 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2499 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:823 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:851 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:192 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:205 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1694 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:198 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:211 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Notícies" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +msgid "Catalog" +msgstr "Catàleg" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2738 msgid "Communicate with iTunes." msgstr "Comunica't amb iTunes" @@ -728,7 +905,7 @@ msgstr "Estableix comunicació amb el lector de llibres electrònics JetBook." #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:88 msgid "Communicate with the MiBuk Wolder reader." -msgstr "" +msgstr "Comunicació amb lector MiBuk Wolder" #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." @@ -736,20 +913,28 @@ msgstr "Estableix comunicació amb el lector de llibres electrònics Kindle" #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 msgid "Communicate with the Kindle 2/3 eBook reader." -msgstr "" +msgstr "Comunicació amb lector Kindle 2/3" #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 msgid "Communicate with the Kindle DX eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics Kindle DX" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:23 msgid "Communicate with the Kobo Reader" msgstr "Comunica amb el lector Kobo Reader" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:47 +msgid "" +"The Kobo supports only one collection currently: the \"Im_Reading\" list. " +"Create a tag called \"Im_Reading\" " +msgstr "" +"El Kobo de moment només dóna suport a una col·lecció: la llista " +"\"Im_Reading\". Creeu una etiqueta amb el nom \"Im_Reading\" " + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -759,37 +944,40 @@ msgstr "Comunica amb el lector Kobo Reader" msgid "Getting list of books on device..." msgstr "S'està obtenint el llistat de llibres disponibles al dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "S'estan suprimint els llibres del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "S'estan suprimint llibres del llistat de metadades del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "S'estan afegint llibres al llistat de metadades del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" -msgstr "" +msgstr "No implementat" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." msgstr "" +"No existeixen arxius \".kobo\" de llibres al dispositiu, per contra hi ha " +"files a la base de dades sqlite. Ara mateix no es poden exportar ni " +"visualitzar" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:17 msgid "Communicate with the Palm Pre" @@ -805,12 +993,16 @@ msgstr "Comunicar-se amb el Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 msgid "Communicate with the Kogan" -msgstr "" +msgstr "Comunicació amb el Kogan" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 msgid "Communicate with the Pandigital Novel" msgstr "Comunicar-se amb el Pandigital Novel" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the GM2000" +msgstr "Comunicació amb el GM2000" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Estableix comunicació amb la tauleta d'Internet Nokia 770." @@ -852,7 +1044,7 @@ msgstr "" "Llistat on apareixen, separats per coma, els camps de metadades per " "traslladar a les col·leccions del dispositiu. Les possibilitats inclouen: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Sense nom" @@ -864,7 +1056,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:11 msgid "Communicate with the Teclast K3/K5 reader." -msgstr "" +msgstr "Comunicació amb lector Teclast K3/K5" #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:36 msgid "Communicate with the Newsmy reader." @@ -874,6 +1066,10 @@ msgstr "Comunicar-se amb el lector Newsmy." msgid "Communicate with the iPapyrus reader." msgstr "Comunicar-se amb el lector iPapyrus." +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59 +msgid "Communicate with the Sovos reader." +msgstr "Comunicar-se amb el lector Sovos." + #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "No s'ha pogut detectar la unitat de disc %s. Proveu a reiniciar." @@ -937,20 +1133,20 @@ msgid "Place files in sub directories if the device supports them" msgstr "Posa els fitxers a subdirectoris si el dispostiu ho permet" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:86 msgid "Read metadata from files on device" msgstr "Llegeix les metadades dels fitxers del dispositiu" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 msgid "Use author sort instead of author" -msgstr "" +msgstr "Emprar l'ordre de l'autor enlloc de l'autor" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 msgid "Template to control how books are saved" msgstr "Planilla per a controlar quants llibres s'han desat" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:89 msgid "Extra customization" msgstr "Personalització addicional" @@ -1588,22 +1784,45 @@ msgstr "" "opció amb compte." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367 +msgid "" +"Scale used to determine the length at which a line should be unwrapped if " +"preprocess is enabled. Valid values are a decimal between 0 and 1. The " +"default is 0.40, just below the median line length. This will unwrap typical " +"books with hard line breaks, but should be reduced if the line length is " +"variable." +msgstr "" +"Escala que es fa servir per determinar la longitud en què una línia s'ha de " +"dividir. Els valors vàlids són un decimal entre 0 i 1. El valor per defecte " +"és 0,40, just per sota de la longitud de la línia mitjana. Això produirà " +"llibres típics amb salts de línia dura, però s'ha de reduir si la longitud " +"de línia és variable." + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:376 +msgid "" +"Convert plain quotes, dashes and ellipsis to their typographically correct " +"equivalents. For details, see http://daringfireball.net/projects/smartypants" +msgstr "" +"Converteix cometes, guions i punts suspensius als seus equivalents " +"tipogràfics correctes. Vegeu http://daringfireball.net/projects/smartypants " +"per a més detalls" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:384 msgid "Use a regular expression to try and remove the header." msgstr "Usa una expressió regular per a tractar i suprimir la capçalera" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:391 msgid "The regular expression to use to remove the header." msgstr "L'expressió per a substituir la capçalera." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:397 msgid "Use a regular expression to try and remove the footer." msgstr "usa una expressió regular per a tractar i suprimir el peu de pàgina." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:404 msgid "The regular expression to use to remove the footer." msgstr "L'expressió per a substituir el peu de pàgina." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:411 msgid "" "Read metadata from the specified OPF file. Metadata read from this file will " "override any metadata in the source file." @@ -1611,7 +1830,7 @@ msgstr "" "Llegeix les metadades de l'arxiu OPF especificat. Les metadades extretes " "d'aquest arxiu substituiran les metadades de l'arxiu d'origen." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:418 msgid "" "Transliterate unicode characters to an ASCII representation. Use with care " "because this will replace unicode characters with ASCII. For instance it " @@ -1628,7 +1847,7 @@ msgstr "" "emprada per la població més nombrosa serà seleccionada (el Xinès a l'exemple " "anterior)." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:433 msgid "" "Preserve ligatures present in the input document. A ligature is a special " "rendering of a pair of characters like ff, fi, fl et cetera. Most readers do " @@ -1644,114 +1863,114 @@ msgstr "" "defecte, calibre canviarà la lligadura per el seu parell de caràcters " "normals corresponents. Aquesta opció serà conservada en el seu lloc." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." msgstr "Establiu el títol" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" "Establiu els autors. Si hi ha diversos autors, haurieu de separar-los amb el " "caràcter \"&\"." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:454 msgid "The version of the title to be used for sorting. " msgstr "La versió del títol a emprar per classificar. " -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "String to be used when sorting by author. " msgstr "Text que s'usarà en l'ordenació per autor. " -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "Set the cover to the specified file or URL" msgstr "Col·locar la portada des del fitxer especificat o URL" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." msgstr "Establiu la descripció del llibre electrònic." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." msgstr "Establiu l'editorial del llibre electrònic." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." msgstr "Establiu la sèria a la que pertany el llibre electrònic." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." msgstr "Col·locar l'index del llibre a aquesta serie." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." msgstr "Establiu la valoració. Ha de ser un nombre entre 1 i 5." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "Establiu el codi ISBN del llibre." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68 msgid "Set the tags for the book. Should be a comma separated list." msgstr "" "Col·locar les etiquetes al llibre. Ha de ser una llista separada per comes." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:477 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." msgstr "Establiu el productor del llibre." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:481 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." msgstr "Establiu la llengua." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 msgid "Set the publication date." msgstr "Col·locar la data de publicació." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" "Col·locar la data i l'hora al llibre (utilitzat per la columna data al " "calibre)." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:606 msgid "Could not find an ebook inside the archive" msgstr "No s'ha pogut trobar cap llibre electrònic dins de l'arxiu" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:664 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" "Els valors de l'índex de la serie i la seva puntuació han de ser números. " "Ignorant" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:671 msgid "Failed to parse date/time" msgstr "No s'ha pogut analitzar la data/hora" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:826 msgid "Converting input to HTML..." msgstr "S'està convertint l'entrada a HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:853 msgid "Running transforms on ebook..." msgstr "S'estàn transformant el llibre electrònic..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:940 msgid "Creating" msgstr "S'està creant" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20 msgid "Failed to parse: %s with error: %s" -msgstr "" +msgstr "Error en el processament: %s amb l'error: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26 msgid "ePub Fixer" @@ -1806,6 +2025,9 @@ msgid "" "Fix unmanifested files. epub-fix can either add them to the manifest or " "delete them as specified by the delete unmanifested option." msgstr "" +"Corregeix fitxers sense declarar. epub-fix pot afegir-los al manifest o " +"esborrar-los tal com s'especifiqui a l'opció \"esborra fitxers sense " +"declarar\"" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:32 msgid "Delete unmanifested files instead of adding them to the manifest" @@ -1910,6 +2132,9 @@ msgid "" "experimental. It can cause conversion to fail. It can also produce " "unexpected output." msgstr "" +"Intenta convertir capítols en seccions individuals. ATENCIÓ: aquesta opció " +"és experimental. Pot fer que falli la conversió. També pot causar resultas " +"inesperats." #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "" @@ -2193,8 +2418,8 @@ msgstr "Còmic" #: /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:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Tí­tol" @@ -2202,8 +2427,8 @@ msgstr "Tí­tol" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "Autor(s)" @@ -2222,31 +2447,33 @@ msgstr "Productor" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1081 msgid "Comments" msgstr "Comentaris" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1075 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1077 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:145 msgid "Tags" msgstr "Etiquetes" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1086 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:93 msgid "Series" msgstr "Sèries" @@ -2255,11 +2482,12 @@ msgid "Language" msgstr "Llengua" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 msgid "Timestamp" msgstr "Marca de temps" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" @@ -2402,16 +2630,16 @@ msgstr "Caràtula descarregada." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79 msgid "Download covers from openlibrary.org" -msgstr "" +msgstr "Descarrega les portades desde openlibrary.org" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 msgid "ISBN: %s not found" -msgstr "" +msgstr "ISBN: no s'ha trobat %s" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117 msgid "Download covers from librarything.com" -msgstr "" +msgstr "Descarrega les portades desde librarything.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:128 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 @@ -2541,7 +2769,7 @@ msgstr "" "Aconsegueix una portada imatge o bé metainformació social per al llibre " "identificat mitjançant ISBN des de LibrqaryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1227 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Cover" msgstr "Portada" @@ -2571,7 +2799,7 @@ msgstr "Títol per qualsevol índex generat en línia." #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:37 msgid "Disable compression of the file contents." -msgstr "" +msgstr "Desactiva la compressió del contigut de l'arxiu" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40 msgid "Tag marking book to be filed with Personal Docs" @@ -2592,7 +2820,7 @@ msgstr "Pàgina del títol" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "Índex" @@ -2656,18 +2884,25 @@ msgstr "Text principal" msgid "%s format books are not supported" msgstr "El format de llibre %s no està suportat" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 +msgid "Book %s of %s" +msgstr "Llibre %s de %s" + #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54 msgid "HTML TOC generation options." msgstr "Opcions de generació del HTML TOC." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:113 -msgid "Book Jacket" -msgstr "Sobrecoberta" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +msgid "Rating" +msgstr "Valoració" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 msgid "" "Could not find reasonable point at which to split: %s Sub-tree size: %d KB" msgstr "" +"No es pot trobar un punt raonable on dividir: %s Tamany del sub-arbre: %d KB" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:32 msgid "OPF/NCX/etc. generation options." @@ -2737,13 +2972,16 @@ msgstr "No extreguis les imatges del document." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:26 msgid "" "Scale used to determine the length at which a line should be unwrapped. " -"Valid values are a decimal between 0 and 1. The default is 0.5, this is the " -"median line length." +"Valid values are a decimal between 0 and 1. The default is 0.45, just below " +"the median line length." msgstr "" +"Escala que es fa servir per determinar la longitud en què una línia s'ha de " +"dividir. Els valors vàlids són un decimal entre 0 i 1. El valor per defecte " +"és 0,45, just per sota de la longitud de la línia mitjana." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30 msgid "Use the new PDF conversion engine." -msgstr "" +msgstr "Utilitza el nou motor de conversió PDF" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/cli.py:31 msgid "" @@ -2756,6 +2994,12 @@ msgid "" "\n" "Manipulate a PDF.\n" msgstr "" +"comanda...\n" +"la comanda pot ser una de les següents:\n" +"[%%commands]\n" +"\n" +"Utilitza %prog comanda --help per obtenir més informació sobre la comanda " +"específica\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:29 msgid "" @@ -2763,6 +3007,11 @@ msgid "" "\n" "Crop a PDF file.\n" msgstr "" +"[options] arxiu.pdf\n" +"\n" +"Divideix un arxiu PDF.\n" +"representa un salt de línia. Comença una nova línia en la posició equivalent " +"de la traducció\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:38 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:32 @@ -2774,32 +3023,43 @@ msgstr "" msgid "" "Path to output file. By default a file is created in the current directory." msgstr "" +"Ruta de l'arxiu de sortida. Per defecte l'arxiu es crea en la carpeta actual." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:41 msgid "Number of pixels to crop from the left most x (default is %s)" msgstr "" +"Número de píxels que s'ha de retallar de l'extrem esquerre de la x (%s per " +"defecte)" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:44 msgid "Number of pixels to crop from the left most y (default is %s)" msgstr "" +"Número de píxels que s'ha de retallar de l'extrem esquerre de la y (%s per " +"defecte)" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:47 msgid "Number of pixels to crop from the right most x (default is %s)" msgstr "" +"Número de píxels que s'ha de retallar de l'extrem dret de la x (%s per " +"defecte)" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:50 msgid "Number of pixels to crop from the right most y (default is %s)" msgstr "" +"Número de píxels que s'ha de retallar de l'extrem dret de la y (%s per " +"defecte)" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:53 msgid "" "A file generated by ghostscript which allows each page to be individually " "cropped `gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox file.pdf 2> bounding`" msgstr "" +"Un arxiu generat per ghostscript que permet retallar cada pàgina per separat " +"`gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox arxiu.pdf 2> bounding`" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:73 msgid "Crop Options:" -msgstr "" +msgstr "Opcions de retallar:" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:73 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60 @@ -2809,7 +3069,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:61 msgid "Options to control the transformation of pdf" -msgstr "" +msgstr "Opcions per controlar la transformació de pdf" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:23 msgid "" @@ -2817,6 +3077,9 @@ msgid "" "\n" "Decrypt a PDF.\n" msgstr "" +"[opcions] arxiu.pdf password\n" +"\n" +"Desencripta un PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60 msgid "Decrypt Options:" @@ -2828,6 +3091,9 @@ msgid "" "\n" "Encrypt a PDF.\n" msgstr "" +"[opcions] arxiu.pdf password\n" +"\n" +"Encripta un PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:54 msgid "Encrypt Options:" @@ -2839,6 +3105,9 @@ msgid "" "\n" "Get info about a PDF.\n" msgstr "" +"arxiu.pdf ...\n" +"\n" +"Obté informació sobre un PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 @@ -2874,10 +3143,15 @@ msgid "" "\n" "Merges individual PDFs.\n" msgstr "" +"[opcions] arxiu1.pdf arxiu2.pdf ...\n" +"\n" +"S'utilitzaran les metadades del primer PDF especificat.\n" +"\n" +"Uneix PDFs individuals.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:56 msgid "Merge Options:" -msgstr "" +msgstr "Opcions de fusió" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:25 msgid "" @@ -2885,6 +3159,9 @@ msgid "" "\n" "Reverse a PDF.\n" msgstr "" +"[opcions] arxiu.pdf\n" +"\n" +"Inverteix un PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:54 msgid "Reverse Options:" @@ -2896,6 +3173,9 @@ msgid "" "\n" "Rotate pages of a PDF clockwise.\n" msgstr "" +"arxiu.pdf graus\n" +"\n" +"Rota les pàgines d'un PDF en sentit horari\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53 msgid "Rotate Options:" @@ -2915,28 +3195,46 @@ msgid "" "\n" "Split a PDF.\n" msgstr "" +"\n" +"%prog %%name [opcions] fitxer.pdf pàgina_a_dividir_en ...\n" +"%prog %%name [opcions] fitxer.pdf interval_de_pàgines_a_dividir_en ...\n" +"\n" +"Ex.\n" +"\n" +"%prog %%nom fitxer.pdf 6\n" +"%prog %%nom fitxer.pdf 6-12\n" +"%prog %%nom fitxer.pdf 6-12 8 10 9-20\n" +"\n" +"Dividir un PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:61 msgid "Split Options:" -msgstr "" +msgstr "Opcions de divisió" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:31 msgid "" "The unit of measure. Default is inch. Choices are %s Note: This does not " "override the unit for margins!" msgstr "" +"La unitat de mesura. Per defecte és polzada. Les disponibles són %s Nota: " +"això no sobreescriu la unitat dels marges!" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:36 msgid "" "The size of the paper. This size will be overridden when an output profile " "is used. Default is letter. Choices are %s" msgstr "" +"Tamany de paper. Aquest tamany serà sobreescrit quan s'utilitzi un perfil de " +"sortida. Per defecte és letter. Les opcions són %s" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:40 msgid "" "Custom size of the document. Use the form widthxheight EG. `123x321` to " "specify the width and height. This overrides any specified paper-size." msgstr "" +"Mida personalitzada del document. Utilitza el format ampladaxalçada, per " +"exemple `123x321`per especificar l'amplada i l'alçada. Això sobreescriu " +"qualsevol mida de paper especificada." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:45 msgid "The orientation of the page. Default is portrait. Choices are %s" @@ -2949,15 +3247,19 @@ msgid "" "Preserve the aspect ratio of the cover, instead of stretching it to fill the " "ull first page of the generated pdf." msgstr "" +"Conserva la relació d'aspecte de la portada, enlloc d'ajustar-la per omplir " +"tota la primera pàgina del pdf generat." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftohtml.py:55 msgid "Could not find pdftohtml, check it is in your PATH" -msgstr "" +msgstr "No es troba pdftohtml, comprova que sigui al teu PATH" #: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:33 msgid "" "Specify the character encoding of the output document. The default is cp1252." msgstr "" +"Especifica la condificació de caracters del document de sortida. Per defecte " +"és cp1252." #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 msgid "" @@ -2965,11 +3267,16 @@ msgid "" "first and then try it.\n" "%s" msgstr "" +"Aquest arxiu RTF té una característica que calibre no suporta. Primer " +"converteix-lo a HTML i després prova-ho.\n" +"%s" #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:23 msgid "" "Specify the character encoding of the output document. The default is utf-8." msgstr "" +"Especifica la condificació de caracters del document de sortida. Per defecte " +"és utf-8" #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:27 msgid "" @@ -2977,22 +3284,28 @@ msgid "" "compression but the fastest and 10 being the highest compression but the " "slowest." msgstr "" +"Especifica el grau de compressió. Escala 1 - 10. 1 és la compressió mínima " +"però la més ràpida i 10 és la compressió màxima però la més lenta." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:34 msgid "" "Normally extra spaces are condensed into a single space. With this option " "all spaces will be displayed." msgstr "" +"Normalment els espais addicionals es condensen en un de sol. Amb aquesta " +"opció es mostraran tots els espais." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:37 msgid "" "Run the text input through the markdown pre-processor. To learn more about " "markdown see" msgstr "" +"Executar la funció de text a través del pre-processador markdown. Per a més " +"informació quant al markdown vegeu" #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:40 msgid "Do not insert a Table of Contents into the output text." -msgstr "" +msgstr "No insereixis una taula de contingut al text de sortida." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:24 msgid "" @@ -3000,12 +3313,18 @@ msgid "" "for compatibility with Mac OS 9 and earlier. For Mac OS X use 'unix'. " "'system' will default to the newline type used by this OS." msgstr "" +"Tipus de salt de línia a utilitzar. Les opcions són %s. Per defecte és " +"'system'. Utilitza 'old_mac' per compatibilitat amb Mac OS 9 i anteriors. " +"Per Mac OS X utilitza 'unix'. 'system' és el tipus per defecte utilitza per " +"aquest SO." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:30 msgid "" "Specify the character encoding of the output document. The default is utf-8. " "Note: This option is not honored by all formats." msgstr "" +"Especifica la codificació de caracters del document de sortida. Per defecte " +"és utf-8. Nota: aquesta opció l'utilitzaran tots els formats." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38 msgid "" @@ -3014,6 +3333,11 @@ msgid "" "the space after and will exceed the specified value. Also, there is a " "minimum of 25 characters. Use 0 to disable line splitting." msgstr "" +"El número màxim de caràcters per línia. Això divideix la línia al primer " +"espai abans del valor que s'especifica. Si no hi ha cap espai la línia es " +"dividirà a l'espai següent i sobrepassarà el valor que s'especifiqui. El " +"valor mínim és de 25 caràcters. Feu servir 0 per desactivar la divisió de " +"línies." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:45 msgid "" @@ -3023,130 +3347,138 @@ msgstr "" "Forçar la divisió de línies en la longitud màxima quan no hi ha cap espai. " "També permet que la longitud de línia màxima sigui menor que el valor mínim." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 msgid "Send file to storage card instead of main memory by default" msgstr "" +"Envia l'arxiu a la targeta de memòria enlloc de a la memòria principal per " +"defecte." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 msgid "Confirm before deleting" msgstr "Confirmeu abans d'esborrar" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 msgid "Main window geometry" -msgstr "" +msgstr "Geometria de la finestra principal" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 msgid "Notify when a new version is available" -msgstr "" +msgstr "Avisa'm quan hi hagi una nova versió disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 msgid "Use Roman numerals for series number" -msgstr "" +msgstr "Utilitza números romans per a sèries de números" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 msgid "Sort tags list by name, popularity, or rating" -msgstr "" +msgstr "Ordena la llista d'etiquetes per nom, popularitat o per rànquing" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 msgid "Number of covers to show in the cover browsing mode" msgstr "" +"Número de portades que es mostraran en el mode de navegació per portades" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 msgid "Defaults for conversion to LRF" -msgstr "" +msgstr "Valors per defecte per a la conversió a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 msgid "Options for the LRF ebook viewer" -msgstr "" +msgstr "Opcions per al lector LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 msgid "Formats that are viewed using the internal viewer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 -msgid "Columns to be displayed in the book list" -msgstr "" +msgstr "Formats que es veuen utilitzant el visor intern" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 -msgid "Automatically launch content server on application startup" -msgstr "" +msgid "Columns to be displayed in the book list" +msgstr "Columnes que es veuran en la llista de llibres" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 -msgid "Oldest news kept in database" +msgid "Automatically launch content server on application startup" msgstr "" +"Arrenca el contingut del servidor automàticamen en iniciar l'aplicació" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +msgid "Oldest news kept in database" +msgstr "Les notícies antigues es conserven en la base de dades" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Show system tray icon" -msgstr "" +msgstr "Mostra la icona a la safata del sistema" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Upload downloaded news to device" -msgstr "" +msgstr "Carrega les notícies descarregades al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 msgid "Delete books from library after uploading to device" msgstr "" +"Elimina els llibres de la biblioteca després de carregar-los al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" -msgstr "" +msgstr "Mostra la portada en una finestra pròpia enlloc de la principal" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 msgid "Disable notifications from the system tray icon" -msgstr "" +msgstr "Inhabilita els missatges des de la icona de la safata del sistema" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 msgid "Default action to perform when send to device button is clicked" msgstr "" +"Acció per defecte per a quan el faci clic al botó d'enviar al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 msgid "Maximum number of waiting worker processes" -msgstr "" +msgstr "Número màxim de processos en espera" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 msgid "Download social metadata (tags/rating/etc.)" -msgstr "" +msgstr "Descarrega metadades socials (etiquetes/valoració/etc)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 msgid "Overwrite author and title with new metadata" -msgstr "" +msgstr "Sobreescriu l'autor i el títol amb les noves metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 msgid "Limit max simultaneous jobs to number of CPUs" -msgstr "" +msgstr "Limita el màxim de tasques simultànies al número de CPUs" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 msgid "tag browser categories not to display" -msgstr "" +msgstr "categories del navegador d'etiquetes que no s'han de mostrar" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 msgid "The layout of the user interface" -msgstr "" +msgstr "Disposició de la interfície de l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 msgid "Show the average rating per item indication in the tag browser" msgstr "" +"Mostra la mitjana de les qualificacions per a cada element de l'explorador " +"d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 msgid "Disable UI animations" -msgstr "" +msgstr "Desactiva les animacions" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "Copiat" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy" msgstr "Copia" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy to Clipboard" -msgstr "" +msgstr "Copia al porta-retalls" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 msgid "Choose Files" msgstr "Escull fitxers" @@ -3157,378 +3489,404 @@ msgstr "Afegeix llibres" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 msgid "Add books to the calibre library/device from files on your computer" msgstr "" +"Afegeix llibres a la biblioteca o al dispositiu des d'arxius de l'ordinador" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "Add books from a single directory" -msgstr "" +msgstr "Afegeix llibres d'un directori" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 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 "" +"Afegeix llibres de directoris, incloent els subdirectoris (un llibre per " +"directori, s'assumeix que cada arxiu és el mateix llibre en diferent format)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" +"Afegeix llibres de directoris, incloent els subdirectoris (varis llibres per " +"directori, s'assumeix que cada arxiu és llibre diferent)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 msgid "Add Empty book. (Book entry with no formats)" -msgstr "" +msgstr "Afegeix un llibre buit (entrada de llibre sense format)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:45 msgid "Add from ISBN" -msgstr "" +msgstr "Afegeix desde ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books?" msgstr "Quants llibres buits?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 msgid "How many empty books should be added?" msgstr "Quants llibres buits haurien d'afegir-se?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:201 msgid "Uploading books to device." msgstr "Pujant llibres a l'aparell." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "Llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "EPUB Books" msgstr "Llibres EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "LRF Books" msgstr "Llibres LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "HTML Books" msgstr "Llibres HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "LIT Books" msgstr "Llibres LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "MOBI Books" msgstr "Llibres Mobi" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Topaz books" msgstr "Llibres Topaz" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Text books" msgstr "Llibres de text" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "PDF Books" msgstr "Llibres PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Comics" msgstr "Còmics" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Archives" msgstr "Arxius" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Supported books" msgstr "Llibres admesos" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 -msgid "Merged some books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 +msgid "Merged some books" +msgstr "S'han unit els llibres" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 -msgid "Failed to read metadata" -msgstr "" +"S'han trobat duplicats i s'han unit als següents llibres que ja existien:" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 -msgid "Failed to read metadata from the following" -msgstr "" +msgid "Failed to read metadata" +msgstr "No s'ha pogut llegir les metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +msgid "Failed to read metadata from the following" +msgstr "No s'ha pogut llegir les metadades del següent" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "Add to library" msgstr "Afegeix a la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" msgstr "Cap llibre seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "" "The following books are virtual and cannot be added to the calibre library:" -msgstr "" +msgstr "Aquests llibres són virtuals i no es poden afegir a la biblioteca:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "No book files found" -msgstr "" +msgstr "No s'han trobat llibres" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:13 msgid "Add books to library" -msgstr "" +msgstr "Afegeix llibres a la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:14 msgid "Add books to your calibre library from the connected device" -msgstr "" +msgstr "Afegeix llibres a la biblioteca des d'un dispositiu connectat" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:498 msgid "Fetch annotations (experimental)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:235 -msgid "Use library only" -msgstr "Fes servir només la llibreria" +msgstr "Recull les anotacions (experimental)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:236 +msgid "Use library only" +msgstr "Fes servir només la llibreria" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:237 msgid "User annotations generated from main library only" msgstr "" +"Anotacions de l'usuari generades només des de la biblioteca principal" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Cap llibre seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:65 msgid "No books selected to fetch annotations from" -msgstr "" +msgstr "No hi ha cap llibre seleccionat del que obtenir les anotacions" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:90 msgid "Merging user annotations into database" -msgstr "" +msgstr "Incorporant les anotacions de l'usuari a la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:118 msgid "%s
Last Page Read: %d (%d%%)" -msgstr "" +msgstr "%s
Última pàgina llegida: %d (%d%%)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:124 msgid "%s
Last Page Read: Location %d (%d%%)" -msgstr "" +msgstr "%s
Última pàgina llegida: localització %d (%d%%)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:143 msgid "Location %d • %s
%s
" -msgstr "" +msgstr "Localització %d • %s
%s
" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:152 msgid "Page %d • %s
" -msgstr "" +msgstr "Pàgina %d • %s
" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:157 msgid "Location %d • %s
" -msgstr "" +msgstr "Localització %d • %s
" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:34 msgid "Create catalog of books in your calibre library" -msgstr "" +msgstr "Crea catàleg de llibres de la teva biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 msgid "No books selected to generate catalog for" -msgstr "" +msgstr "No hi ha llibres seleccionats per generar el catàleg" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 msgid "Generating %s catalog..." -msgstr "" +msgstr "Generant %s catàleg..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 msgid "No books found" msgstr "No trobo llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" +"No hi ha llibres per catalogar\n" +"Comprova les etiquetes d'exclusió" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Catalog generated." msgstr "Catàleg generat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 msgid "Export Catalog Directory" -msgstr "" +msgstr "Directori d'exportació del catàleg" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 msgid "Select destination for %s.%s" -msgstr "" +msgstr "Seleccioneu una destinació per a %s.%s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:111 msgid "%d books" -msgstr "" +msgstr "%d llibres" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82 msgid "Choose calibre library to work with" -msgstr "" +msgstr "Trieu una biblioteca del calibre per treballar" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 msgid "Switch/create library..." -msgstr "" +msgstr "Canvia/crea una biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:99 msgid "Quick switch" -msgstr "" +msgstr "Canvi ràpid" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:101 msgid "Rename library" -msgstr "" +msgstr "Canvia el nom de la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:103 msgid "Delete library" -msgstr "" +msgstr "Esborra la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 msgid "Rename" -msgstr "" +msgstr "Canvia el nom" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:169 msgid "Choose a new name for the library %s. " -msgstr "" +msgstr "Tria un nom nou per a la biblioteca %s. " #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 msgid "Note that the actual library folder will be renamed." msgstr "" +"Tingueu en compte que es canviarà el norm a la carpeta de la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:177 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 msgid "Already exists" -msgstr "" +msgstr "Ja existeix" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 msgid "The folder %s already exists. Delete it first." -msgstr "" +msgstr "La carpeta %s ja existeix. Esborreu-la primer." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +msgid "Rename failed" +msgstr "Ha fallat el canvi de nom" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:185 +msgid "" +"Failed to rename the library at %s. The most common cause for this is if one " +"of the files in the library is open in another program." +msgstr "" +"Ha fallat el canvi de nom de la biblioteca a %s. La causa més habitual és " +"que un altre programa té obert un dels fitxers de la bibilioteca ." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 msgid "Are you sure?" msgstr "N'estàs segur?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:196 msgid "All files from %s will be permanently deleted. Are you sure?" msgstr "" +"S'esborraran permanentment tots els fitxers de %s. N'esteu segur?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:216 msgid "No library found" -msgstr "" +msgstr "No s'ha trobat cap llibreria" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:217 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" +"No hi ha cap biblioteques del calibre a %s. S'esborrarà de la llista de " +"biblioteques conegudes." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 msgid "Not allowed" -msgstr "" +msgstr "No està permès" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:250 msgid "You cannot change libraries when a device is connected." msgstr "" +"No podeu canviar les biblioteques quan hi ha un dispositiu connectat." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:255 msgid "You cannot change libraries while jobs are running." -msgstr "" +msgstr "No podeu canviar les biblioteques mentre hi ha treballs en execució." #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22 msgid "C" -msgstr "" +msgstr "C" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22 msgid "Convert books" msgstr "Converteix llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 msgid "Convert individually" msgstr "Converteix individualment" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 msgid "Bulk convert" msgstr "Converteix tots" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 msgid "Cannot convert" msgstr "No puc convertir-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:115 msgid "Starting conversion of %d book(s)" -msgstr "" +msgstr "S'està començant la conversió de %d llibre(s)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:79 msgid "Copy to library" -msgstr "" +msgstr "Copia a la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:80 msgid "Copy selected books to the specified library" -msgstr "" +msgstr "Copia els llibres seleccionats a la biblioteca que s'ha especificat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 msgid "Cannot copy" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:119 -msgid "No library" -msgstr "" +msgstr "No es pot copiar" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +msgid "No library" +msgstr "No hi ha biblioteca" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "No library found at %s" -msgstr "" +msgstr "No s'ha trobat cap biblioteca a %s" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 msgid "Copying" -msgstr "" +msgstr "S'està copiant" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 msgid "Could not copy books: " -msgstr "" +msgstr "No s'ha pogut copiar els llibres: " -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 msgid "Failed" -msgstr "" +msgstr "Ha fallat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:141 msgid "Copied %d books to %s" -msgstr "" +msgstr "S'ha copiat %d llibres a %s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18 msgid "Del" @@ -3538,121 +3896,128 @@ msgstr "Esborra" msgid "Remove books" msgstr "Suprimeix llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:24 msgid "Remove selected books" -msgstr "" +msgstr "Elimina els llibres que s'han seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:26 msgid "Remove files of a specific format from selected books.." msgstr "" +"Elimina els fitxers d'un format específic dels llibres que s'han " +"seleccionat.." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:29 msgid "Remove all formats from selected books, except..." msgstr "" +"Elimina tots els formats dels llibres que s'han seleccionat escepte..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:32 msgid "Remove covers from selected books" -msgstr "" +msgstr "Elimina les portades dels llibres que s'han seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:35 msgid "Remove matching books from device" -msgstr "" +msgstr "Elimina els llibres que concordin del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:53 msgid "Cannot delete" msgstr "No puc esborrar" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:66 msgid "Choose formats to be deleted" -msgstr "" +msgstr "Trieu els formats que s'esborraran" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:84 msgid "Choose formats not to be deleted" -msgstr "" +msgstr "Trieu els formats que no s'esborraran" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 msgid "Cannot delete books" msgstr "No puc esborrar llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 msgid "No device is connected" -msgstr "" +msgstr "No hi ha cap dispositiu connectat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 msgid "Main memory" msgstr "Memòria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Storage Card A" msgstr "Tarja de memòria A" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 msgid "Storage Card B" msgstr "Tarja de memòria B" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 msgid "No books to delete" msgstr "Cap llibre per esborrar" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:123 msgid "None of the selected books are on the device" -msgstr "" +msgstr "Cap dels llibres que s'han seleccionat són al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:195 msgid "Deleting books from device." -msgstr "" +msgstr "S'estan eliminant llibres del dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:161 msgid "" "The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" +"from your calibre library. Are you sure?" msgstr "" +"Els llibres que s'han seleccionat s'eliminaran permanentment i els " +"fitxers es suprimiran de la vostra llibreria del calibre. N'esteu segur?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:180 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" msgstr "" +"Els llibres que s'han seleccionat s'eliminaran permanentment del " +"dispositiu. N'esteu segur?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" -msgstr "" +msgstr "Connecta a una carpeta" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:31 msgid "Connect to iTunes" -msgstr "" +msgstr "Connecta a iTunes" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:40 #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:48 msgid "Start Content Server" -msgstr "" +msgstr "Inicia el servidor de continguts" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:50 msgid "Stop Content Server" -msgstr "" +msgstr "Atura el servidor de contingut" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid "Email to" -msgstr "" +msgstr "Envia per correu electrònic a" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid " and delete from library" -msgstr "" +msgstr " i esborra'l de la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81 msgid "Setup email based sharing of books" -msgstr "" +msgstr "Configura la compartició de llibres per correu electrònic" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "D" -msgstr "" +msgstr "D" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "Send to device" @@ -3660,15 +4025,15 @@ msgstr "Envia al dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:117 msgid "Connect/share" -msgstr "" +msgstr "Connecta/comparteix" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:13 msgid "Manage collections" -msgstr "" +msgstr "Gestiona les coo·leccions" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:14 msgid "Manage the collections on this device" -msgstr "" +msgstr "Gestiona les col·leccions d'aquest dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" @@ -3676,129 +4041,141 @@ msgstr "E" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "Edit metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:27 -msgid "Merge book records" -msgstr "" +msgstr "Edita metadades" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 -msgid "M" -msgstr "" +msgid "Merge book records" +msgstr "Fusiona els registres de llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:29 +msgid "M" +msgstr "M" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:31 msgid "Edit metadata individually" msgstr "Edita metadades individualment" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:34 msgid "Edit metadata in bulk" msgstr "Edita metadades en massa" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:37 msgid "Download metadata and covers" -msgstr "" +msgstr "Descarrega metadades i cobertes" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:40 msgid "Download only metadata" -msgstr "" +msgstr "Descarrega només les metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:42 msgid "Download only covers" -msgstr "" +msgstr "Descarrega només les portades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:45 msgid "Download only social metadata" -msgstr "" +msgstr "Descarrega només les metadades socials" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:51 msgid "Merge into first selected book - delete others" -msgstr "" +msgstr "Fusiona al primer llibre que s'ha seleccionat - esborra la resta" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:54 msgid "Merge into first selected book - keep others" -msgstr "" +msgstr "Fusiona al primer llibre que s'ha seleccionat - conserva la resta" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 msgid "Cannot download metadata" -msgstr "" +msgstr "No es poden descarregar les metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 msgid "social metadata" msgstr "Metadades socials" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "covers" msgstr "portades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "metadata" -msgstr "" +msgstr "metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:105 msgid "Downloading %s for %d book(s)" -msgstr "" +msgstr "S'està descarregant %s per a %d llibre(s)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 msgid "Failed to download some metadata" -msgstr "" +msgstr "No s'ha pogut descarregar algunes metadedes" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:127 msgid "Failed to download metadata for the following:" -msgstr "" +msgstr "No s'ha pogut descarregar les metadades de:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130 msgid "Failed to download metadata:" -msgstr "" +msgstr "No s'ha pogut descarregar les metadades:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:112 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Error" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:177 msgid "Cannot edit metadata" msgstr "No puc editar les meta-dades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:202 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 msgid "Cannot merge books" -msgstr "" +msgstr "No es pot fusionar els llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 msgid "At least two books must be selected for merging" -msgstr "" +msgstr "Cal seleccionar almenys dos llibres per fer una fusió" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." +"Book formats and metadata from the selected books will be added to the " +"first selected book. ISBN will not be merged.

The " +"second and subsequently selected books will not be deleted or " +"changed.

Please confirm you want to proceed." msgstr "" +"S'afegiran els formats i les metadades dels llibres que s'han seleccionat al " +"primer dels llibres que s'ha seleccionat. L'ISBN no es " +"fusionarà. El segon llibre i els que s'hagin seleccionat a continuació no " +"s'esborraran ni canviaran

Si us plau confirmeu que voleu continuar." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" +"Book formats and metadata from the selected books will be merged into the " +"first selected book. ISBN will not be merged.

After " +"merger the second and subsequently selected books will be deleted. " +"

All book formats of the first selected book will be kept and any " +"duplicate formats in the second and subsequently selected books will be " +"permanently deleted from your computer.

Are you sure " +"you want to proceed?" msgstr "" +"Es fusionaran els formats i les metadades dels llibres que s'han seleccionat " +"al primer dels llibres seleccionats. L'ISBN no es fusionarà. " +"Després de fusionar-los el segon llibre i els que s'hagin seleccionat a " +"continuació s'esborraran de forma permanent de vostre " +"ordinador.

Esteu segur que voleu continuar?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" msgstr "" +"Esteu a punt de fusionar més de 5 llibres. Esteu segur que voleu " +"continuar?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:18 msgid "F" -msgstr "" +msgstr "F" #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:18 msgid "Fetch news" @@ -3806,19 +4183,19 @@ msgstr "Recull notí­cies (RSS)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:53 msgid "Fetching news from " -msgstr "" +msgstr "S'està aconseguint notícies de " #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:67 msgid " fetched." -msgstr "" +msgstr " s'han obtingut" #: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 msgid "Browse the calibre User Manual" -msgstr "" +msgstr "Explora el manual d'usuari del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 msgid "F1" -msgstr "" +msgstr "F1" #: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 msgid "Help" @@ -3826,19 +4203,19 @@ msgstr "Ajuda" #: /home/kovid/work/calibre/src/calibre/gui2/actions/open.py:14 msgid "Open containing folder" -msgstr "" +msgstr "Obre la carpeta que el conté" #: /home/kovid/work/calibre/src/calibre/gui2/actions/open.py:15 msgid "O" -msgstr "" +msgstr "O" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 msgid "Ctrl+P" -msgstr "" +msgstr "Ctrl+P" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 msgid "Run welcome wizard" -msgstr "" +msgstr "Executa l'asitent de benvinguda" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 @@ -3851,173 +4228,180 @@ msgstr "No puc configurar-lo amb treballs processant-se" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure before calibre is restarted." -msgstr "" +msgstr "No es pot congigurar fins que el calibre es torni a engegar." #: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14 msgid "&Restart" -msgstr "" +msgstr "&Reinicia" #: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14 msgid "Ctrl+R" -msgstr "" +msgstr "Ctrl+R" #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:24 msgid "Save single format to disk..." -msgstr "" +msgstr "Desa en un sol format al disc..." #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:40 msgid "S" -msgstr "" +msgstr "S" #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:46 msgid "Save to disk" msgstr "Desa al disc" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48 msgid "Save to disk in a single directory" -msgstr "" +msgstr "Desa al disc en una única carpeta" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:69 msgid "Save only %s format to disk" -msgstr "" +msgstr "Desa al disc només en el format %s" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:72 msgid "Save only %s format to disk in a single directory" -msgstr "" +msgstr "Desa al disc en una única carpeta només en el format %s" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 msgid "Cannot save to disk" msgstr "No puc desar al disc" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:94 msgid "Choose destination directory" -msgstr "" +msgstr "Tria el directori de destí" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:102 msgid "" "You are trying to save files into the calibre library. This can cause " "corruption of your library. Save to disk is meant to export files from your " "calibre library elsewhere." msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135 -msgid "Error while saving" -msgstr "" +"Esteu intentant desar fitxers a la biblioteca del calibre. Això pot causar " +"corrupció a la vostra llibreria. Desar al disc està fet per exportar fitxers " +"des de la vostra llibreria del calibre a un altre lloc." #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 +msgid "Error while saving" +msgstr "Error mentres es desava" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:137 msgid "There was an error while saving." -msgstr "" +msgstr "Hi ha hagut un error mentres es desava." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:143 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:144 -msgid "Could not save some books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 +msgid "Could not save some books" +msgstr "No s'ha pogut desar alguns llibres" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:146 msgid "Click the show details button to see which ones." -msgstr "" +msgstr "Feu clic al botó \"Mostra detalls\" per veure quins són." #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 msgid "Show book details" -msgstr "" +msgstr "Mostra detalls del llibre" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:17 msgid "I" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 -msgid "No detailed info available" -msgstr "" +msgstr "I" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 +msgid "No detailed info available" +msgstr "No es disposa d'informació detallada" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:27 msgid "No detailed information is available for books on the device." msgstr "" +"No es disposa d'informació detallada per als llibres d'aquest dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:17 msgid "Similar books..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 -msgid "Alt+A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 -msgid "Books by same author" -msgstr "" +msgstr "Llibres semblants..." #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 -msgid "Books in this series" -msgstr "" +msgid "Alt+A" +msgstr "Alt+A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 +msgid "Books by same author" +msgstr "Llibres del mateix autor" #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +msgid "Books in this series" +msgstr "Llibres d'aquesta sèrie" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Alt+Shift+S" -msgstr "" +msgstr "Alt+Maj+S" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+P" -msgstr "" +msgstr "Alt+P" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books by this publisher" -msgstr "" +msgstr "Llibres d'aquesta editorial" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Alt+T" -msgstr "" +msgstr "Alt+T" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Books with the same tags" -msgstr "" +msgstr "Llibres amb les mateixes etiquetes" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" -msgstr "" +msgstr "V" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 msgid "View" msgstr "Mostra" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:33 msgid "View specific format" -msgstr "" +msgstr "Visualitza un format concret" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 msgid "Cannot view" msgstr "No puc mostrar-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 msgid "Choose the format to view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 -msgid "Multiple Books Selected" -msgstr "" +msgstr "Trieu el format de visualització" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 +msgid "Multiple Books Selected" +msgstr "S'ha seleccionat múltiples llibres" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 msgid "" "You are attempting to open %d books. Opening too many books at once can be " "slow and have a negative effect on the responsiveness of your computer. Once " "started the process cannot be stopped until complete. Do you wish to " "continue?" msgstr "" +"Esteu intentant obrir %d llibres. Obrir massa llibres simultàniament pot ser " +"lent i tenir un efecte negatiu a la resposta del vostre equip. Si s'inicia " +"el procés no es pot aturar fins que s'acabi. Voleu continuar?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "Cannot open folder" -msgstr "" +msgstr "No es pot obrir la carpeta" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 msgid "%s has no available formats." -msgstr "" +msgstr "No hi ha formats disponibles a %s." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" -msgstr "" +msgstr "S'està cercant a" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:197 msgid "Adding..." @@ -4025,18 +4409,18 @@ msgstr "Afegint..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:210 msgid "Searching in all sub-directories..." -msgstr "" +msgstr "S'està cercant a totes les subcarpetes..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:223 msgid "Path error" -msgstr "" +msgstr "Error al camí" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "The specified directory could not be processed." -msgstr "" +msgstr "La carpeta que s'ha especificat no es pot processar." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 msgid "No books" msgstr "Cap llibre" @@ -4046,13 +4430,16 @@ msgstr "Afegit" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:306 msgid "Adding failed" -msgstr "" +msgstr "Ha fallat en afegir" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." msgstr "" +"Sembla que el procés d'afegir llibres no respon. Intenteu tornar a iniciar " +"el calibre i afegiu els llibres en grups més petits, fins que trobeu el " +"llibre que causa el problema." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:322 msgid "Duplicates found!" @@ -4063,10 +4450,12 @@ msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" +"Ja hi ha llibres amb el mateix títol a la base de dades. S'afegeixen " +"igualment?" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:326 msgid "Adding duplicates..." -msgstr "" +msgstr "S'estan afegint els duplicats..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:393 msgid "Saving..." @@ -4078,59 +4467,59 @@ msgstr "Desat" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:57 msgid "Searching for sub-folders" -msgstr "" +msgstr "S'estan buscant subcarpetes" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:62 msgid "Searching for books" -msgstr "" +msgstr "S'estan buscant llibres" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:74 msgid "Looking for duplicates based on file hash" -msgstr "" +msgstr "S'estan buscant duplicats al hash del fitxer" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" -msgstr "" +msgstr "Trieu la carpeta arrel" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:137 msgid "Invalid root folder" -msgstr "" +msgstr "Carpeta arrel no vàlida" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:138 msgid "is not a valid root folder" -msgstr "" +msgstr "no és una carpeta arrel vàlida" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:148 msgid "Add books to calibre" -msgstr "" +msgstr "Afegeix llibres al calibre" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:41 msgid "WizardPage" -msgstr "" +msgstr "Pàgina de l'assistent" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:22 msgid "Scanning root folder for books" -msgstr "" +msgstr "S'estan buscant llibres a la carpeta arrel" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:23 msgid "This may take a few minutes" -msgstr "" +msgstr "Pot trigar uns quants minuts" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "Choose the location to add books from" -msgstr "" +msgstr "Trieu el lloc des d'on s'han d'afegir els llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 msgid "Select a folder on your hard disk" -msgstr "" +msgstr "Seleccioneu una carpeta del vostre disc dur" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 msgid "" "

calibre can scan your computer for existing books automatically. These " "books will then be copied into the calibre library. This wizard will " @@ -4141,87 +4530,99 @@ msgid "" "

Make sure that the folder you chose for your calibre library is " "not under the root folder you choose.

" msgstr "" +"

el calibre pot cercar llibres que hi hagi al vostre ordinador " +"automàticament. Aquests llibres es copiaran a la biblioteca del " +"calibre. Aquest assistent us ajudarà a personalitzar el procés de cerca i " +"importació de la vostra col·lecció de llibres.

\n" +"

Trieu una carpeta arrel. Només es cercaran llibres dins d'aquesta carpeta " +"i de les seves subcarpetes.

\n" +"

Assegureu-vos que la carpeta escollida per a la vostra biblioteca del " +"calibre no està dins de la carpeta arrel que heu triat.

" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" -msgstr "" +msgstr "Carpeta a&rrel:" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 msgid "" "This folder and its sub-folders will be scanned for books to import into " "calibre's library" msgstr "" +"Es cercaran llibres a aquesta carpeta i les seves subcarpetes per importar-" +"los a la biblioteca del calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:702 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 +#: /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:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:136 +#: /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/preferences/behavior_ui.py:156 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:157 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/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/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/shortcuts_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" -msgstr "" +msgstr "Gestiona múltiples fitxers per llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:73 msgid "" "&One book per folder, assumes every ebook file in a folder is the same book " "in a different format" msgstr "" +"&Un llibre per carpeta. S'assumeix que tots els fitxers de llibre electrònic " +"en una carpeta són el mateix llibre en diferents formats" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:74 msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" +"&Múltiples llibres per carpeta. S'assumeix que tots els fitxers de llibre " +"electrònic són llibres diferents" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 @@ -4232,8 +4633,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1065 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Path" msgstr "Camí" @@ -4243,15 +4644,15 @@ msgstr "Camí" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Formats" msgstr "Formats" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:891 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1070 msgid "Collections" msgstr "Col·leccions" @@ -4261,25 +4662,25 @@ msgid "Click to open" msgstr "Clica per obrir" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1080 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "Cap" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 msgid "Click to open Book Details window" -msgstr "" +msgstr "Feu clic per obrir el quadre de \"Detalls del llibre\"" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 msgid "BibTeX Options" -msgstr "" +msgstr "Opcions de BibTeX" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17 @@ -4298,7 +4699,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 msgid "Options specific to" -msgstr "" +msgstr "Opcions específiques per" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17 @@ -4312,20 +4713,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 msgid "output" -msgstr "" +msgstr "sortida" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:88 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:31 @@ -4333,48 +4734,58 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "Forma" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:82 msgid "Bib file encoding:" -msgstr "" +msgstr "Codificació del fitxer bib:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:38 msgid "Fields to include in output:" -msgstr "" +msgstr "Camps que s'inclouran a la sortida:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:84 msgid "ascii/LaTeX" -msgstr "" +msgstr "ascii/LaTeX" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:85 msgid "Encoding configuration (change if you have errors) :" -msgstr "" +msgstr "Configuració de la codificació (canvieu-ho si hi ha errors):" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 msgid "strict" -msgstr "" +msgstr "estricte" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:87 msgid "replace" -msgstr "" +msgstr "reemplaça" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:88 msgid "ignore" @@ -4382,15 +4793,15 @@ msgstr "ignora" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:89 msgid "backslashreplace" -msgstr "" +msgstr "substitució de la barra invertida" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:90 msgid "BibTeX entry type:" -msgstr "" +msgstr "Tipus d'entrada BibTeX:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:91 msgid "mixed" -msgstr "" +msgstr "mixt" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:92 msgid "misc" @@ -4402,11 +4813,11 @@ msgstr "llibre" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:94 msgid "Create a citation tag?" -msgstr "" +msgstr "S'ha de crear una etiqueta de cita?" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:95 msgid "Expression to form the BibTeX citation tag:" -msgstr "" +msgstr "Expressió per crear l'etiqueta de cita BibTeX:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:96 msgid "" @@ -4418,39 +4829,41 @@ msgid "" " wil be selected.\n" " -For time field, only the date will be used. " msgstr "" +"Algunes explicacions sobre aquesta plantilla:\n" +" -Els camps disponibles són 'author_sort', 'authors', 'id',\n" +" 'isbn', 'pubdate', 'publisher', 'series_index', 'series',\n" +" 'tags', 'timestamp', 'title', 'uuid'\n" +" -Per a tipus de llista, com autors i etiquetes, només es\n" +" seleccionarà el primer element.\n" +" -Per als camps de temps només es farà servir la data. " #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" -msgstr "" +msgstr "Opcions de CSV/XML" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17 msgid "E-book options" -msgstr "" +msgstr "Opcions de llibre electrònic" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:550 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1657 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 -msgid "Catalog" -msgstr "Catàleg" - -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 msgid "'Don't include this book' tag:" -msgstr "" +msgstr "Etiqueta 'no incloguis aquest llibre':" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 msgid "'Mark this book as read' tag:" -msgstr "" +msgstr "Etiqueta 'marca aquest llibre com a llegit':" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 msgid "Additional note tag prefix:" -msgstr "" +msgstr "Prefix d'etiqueta de nota addicional:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" +"Expressió regular per a descriure les etiquetes que s'exclouran com a " +"gèneres:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4458,22 +4871,31 @@ msgid "" "- A regex pattern of a single dot excludes all genre tags, generating no " "Genre Section" msgstr "" +"Consells per a les expressions regulars:\n" +"-L'expressió per defecte - \\[.+\\] - exclou de les etiquetes de gènere les " +"que tenen la forma [etiqueta], per exemple [Regal d'Amazon]\n" +"-Un patró d'expressió amb només un punt exclou totes les etiquetes de gènere " +"i es crea la secció 'sense gènere'" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 msgid "Include 'Titles' Section" -msgstr "" +msgstr "Inclou la secció 'Títols'" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" -msgstr "" +msgstr "Inclou la secció 'Afegits recentment'" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" -msgstr "" +msgstr "Ordena els números com a text" + +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +msgid "Include 'Series' Section" +msgstr "Inclou la secció 'Sèries'" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 msgid "Tab template for catalog.ui" -msgstr "" +msgstr "Platilla de fitxa per al catalog.ui" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" @@ -4481,19 +4903,22 @@ msgid "" "in a previous conversion (if they exist) instead of using the defaults " "specified in the Preferences" msgstr "" +"Per als paràmetres que no es poden especificar en aquest quadre, feu servir " +"els valors desats d'una conversió prèvia (si existeix) en comptes de fer " +"servir els valors per defecte que s'especifiquen a les Preferències" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 msgid "Bulk Convert" -msgstr "" +msgstr "Convertir en massa" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." -msgstr "" +msgstr "Opcions específiques per al format de sortida" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:15 msgid "Comic Input" -msgstr "" +msgstr "Entrada de còmic" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 @@ -4504,111 +4929,119 @@ msgid "input" msgstr "entrada" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" -msgstr "" +msgstr "&Nombre de colors" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" -msgstr "" +msgstr "Inhabilita i &normalitza" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" -msgstr "" +msgstr "Manté la relació d'&aspecte" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" -msgstr "" +msgstr "Desactiva l'&enfoc" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" -msgstr "" +msgstr "Desactiva el &retallat" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" -msgstr "" +msgstr "A&mplada" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" -msgstr "" +msgstr "A&païsat" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" -msgstr "" +msgstr "De dreta a es&querra" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" -msgstr "" +msgstr "No &ordenis" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" -msgstr "" +msgstr "Nete&ja artefactes" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:99 msgid "&Disable comic processing" -msgstr "" +msgstr "&Inhabilita el processament de còmics" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" -msgstr "" +msgstr "F&ormat de sortida:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:101 msgid "Disable conversion of images to &black and white" -msgstr "" +msgstr "Inhabilita la conversió d'imatges a &blanc i negre" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:19 msgid "Debug" -msgstr "" +msgstr "Depura" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:21 msgid "Debug the conversion process." -msgstr "" +msgstr "Depura el provés de conversió." #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" -msgstr "" +msgstr "Tria la carpeta de depuració" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:58 msgid "Invalid debug directory" -msgstr "" +msgstr "Carpeta de depuració no vàlida" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:59 msgid "Failed to create debug directory" -msgstr "" +msgstr "No s'ha pogut crear la carpeta de depuració" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 msgid "" "Choose a folder to put the debug output into. If you specify a folder, " "calibre will place a lot of debug output into it. This will be useful in " "understanding the conversion process and figuring out the correct values for " "conversion parameters like Table of Contents and Chapter Detection." msgstr "" +"Trieu una carpeta per posar-hi la sortida de depuració. Si especifiqueu una " +"carpeta, el calibre hi posarà una gran quantitat d'informació de depuració. " +"Això serà útil per a entendre el procés de conversió i esbrinar els valors " +"correctes per als paràmetres de conversió com en l'índex i en la detecció de " +"capítols." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 msgid "" "The debug process outputs the intermediate HTML generated at various stages " "of the conversion process. This HTML can sometimes serve as a good starting " "point for hand editing a conversion." msgstr "" +"El procés de depuració treu l'HTML intermedi que s'ha generat en diversos " +"estadis del procés de conversió. Aquest HTML pot ser alguns cops un bon punt " +"de sortida per editar a mà una conversió." #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:15 msgid "EPUB Output" -msgstr "" +msgstr "Sortida EPUB" #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:49 msgid "Do not &split on page breaks" -msgstr "" +msgstr "No ÷ixis en els salts de pàgina" #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:50 msgid "No default &cover" @@ -4628,7 +5061,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:54 msgid " KB" -msgstr "" +msgstr " KB" #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:12 msgid "FB2 Input" @@ -4653,11 +5086,11 @@ msgstr "" msgid "Sectionize Chapters (Use with care!)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 msgid "" "

This wizard will help you choose an appropriate font size key for your " "needs. Just enter the base font size of the input document and then enter an " @@ -4673,25 +5106,25 @@ msgid "" "for a discussion of how font size rescaling works.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 msgid "&Output document" -msgstr "" +msgstr "&Document de sortida" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 msgid "&Base font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Font size &key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 @@ -4700,25 +5133,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:127 msgid " pt" -msgstr "" +msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 msgid "Use &default values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 msgid "&Input document" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:116 msgid "&Font size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:118 msgid " will map to size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:119 msgid "0.0 pt" msgstr "0.0 pt" @@ -4742,69 +5175,73 @@ msgstr "" msgid "Justify text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 msgid "&Disable font size rescaling" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 msgid "Base &font size:" msgstr "Grandària de lletra base:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Line &height:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Input character &encoding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid "Remove &spacing between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 msgid "" "

When calibre removes inter paragraph spacing, it automatically sets a " "paragraph indent, to ensure that paragraphs can be easily distinguished. " "This option controls the width of that indent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "Text justification:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid "&Linearize tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Extra &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Insert &blank line" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "Keep &ligatures" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +msgid "Smarten &punctuation" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" @@ -4859,7 +5296,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metadades" @@ -4870,95 +5307,95 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "No pot llegir-se" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "No tens permissos per a llegir l'arxiu: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Error llegint l'arxiu" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

There was an error reading from file:
" msgstr "

Error llegint de l'arxiu:
" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " no és una imatge vàlida" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 msgid "Book Cover" msgstr "Coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Change &cover image:" msgstr "Canvia la imatge de la &coberta:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 msgid "Browse for an image to use as the cover of this book." msgstr "Cerca una imatge per a utilitzar com a coberta d'aquest llibre." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 msgid "&Title: " msgstr "&Tí­tol: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "Change the title of this book" msgstr "Canvia el tí­tol del llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Author(s): " msgstr "&Autor(s): " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 msgid "Author So&rt:" msgstr "Ord&re per autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" "Canvia l'autor(s). Per a especificar més d'un, separeu-los amb comes." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "&Publisher: " msgstr "&Editorial: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "Ta&gs: " msgstr "Etique&tes: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -4966,23 +5403,23 @@ msgstr "" "Etiquetes per a categoritzar el llibre (especialment útil per a recerques). " "

Pot emprar-se qualsevol paraula o frase, separada per comes." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "&Series:" msgstr "&Sèries:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "List of known series. You can add new series." msgstr "Llistat de sèries conegudes. Podeu afegir-hi de noves." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "Book " msgstr "Llibre " @@ -4990,7 +5427,7 @@ msgstr "Llibre " msgid "MOBI Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 msgid "Default" msgstr "Per defecte" @@ -5141,7 +5578,7 @@ msgid "Regex:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Test" msgstr "" @@ -5153,18 +5590,18 @@ msgstr "Converteix" msgid "Options specific to the input format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53 msgid "Dialog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:118 msgid "&Input format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:119 msgid "Use &saved conversion settings for individual books" msgstr "" @@ -5179,66 +5616,70 @@ msgid "" "Fine tune the detection of chapter headings and other document structure." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:37 msgid "Detect chapters at (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 msgid "Insert page breaks before (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:40 msgid "Header regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:43 msgid "Footer regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39 msgid "Invalid XPath" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:40 msgid "The XPath expression %s is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:81 msgid "Chapter &mark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:82 msgid "Remove first &image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:83 msgid "Insert &metadata as page at start of book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64 -msgid "&Preprocess input file to possibly improve structure detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:84 msgid "Remove F&ooter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:85 msgid "Remove H&eader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 +msgid "Line &un-wrap factor during preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 +msgid "&Preprocess input file to possibly improve structure detection" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16 msgid "" "Table of\n" @@ -5320,18 +5761,18 @@ msgstr "" msgid "Force maximum line length" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:55 msgid "TextLabel" msgstr "TextLabel" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 msgid "Use a wizard to help construct the XPath expression" msgstr "" @@ -5432,16 +5873,12 @@ msgid "Undefined" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:133 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:241 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:119 msgid "Yes" msgstr "Sí" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:243 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:121 msgid "No" @@ -5464,7 +5901,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 msgid "Automatically number books in this series" msgstr "" @@ -5480,97 +5917,97 @@ msgstr "" msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:165 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:283 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:294 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:313 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:342 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:357 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:384 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Send to main memory" msgstr "Envia a la memòria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:426 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 msgid "Main Memory" msgstr "Memòria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 msgid "Error communicating with device" msgstr "Error en la comunicació amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:629 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 msgid "Error talking to device" msgstr "Error comunicant amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -5578,157 +6015,157 @@ msgstr "" "Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " "connectar el dispositiu i torne a iniciar el programa" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 msgid "Cannot send: No device is connected" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "per" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "News:" msgstr "Notícies:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 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:1278 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 msgid "No space on device" msgstr "Sense espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 msgid "" "

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

No puc desar llibres al dispositiu perquè no hi ha espai restant " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 msgid "Select available formats and their order for this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" "

Enter a list of ISBNs in the box to the left, one per line. calibre will " "automatically create entries for books based on the ISBN and download " @@ -5736,19 +6173,19 @@ msgid "" "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" msgstr "" @@ -5757,7 +6194,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 msgid "Generate catalog" msgstr "" @@ -5782,7 +6219,7 @@ msgstr "" msgid "Catalog options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "Trieu format" @@ -5830,27 +6267,27 @@ msgstr "" msgid "%s is not an existing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" msgstr "" @@ -5862,15 +6299,15 @@ msgstr "" msgid "Set options for converting %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" msgstr "&Perfil:" @@ -5878,1110 +6315,11 @@ msgstr "&Perfil:" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 -msgid "%(plugin_type)s %(plugins)s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 -msgid "plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 -msgid "" -"\n" -"Customization: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "General" -msgstr "General" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "Conversion" -msgstr "Conversió" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 -msgid "" -"Email\n" -"Delivery" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 -msgid "Add/Save" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 -msgid "Advanced" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 -msgid "" -"Content\n" -"Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:205 -msgid "Plugins" -msgstr "Plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Auto send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 -msgid "Formats to email. The first matching format will be sent." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:235 -msgid "" -"If checked, downloaded news will be automatically mailed
to this email " -"address (provided it is in one of the listed formats)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:309 -msgid "new email address" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Wide" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Narrow" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Medium" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Small" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 -msgid "Large" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Always" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Automatic" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:517 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 -msgid "Never" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:530 -msgid "Toolbars/Context menus" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:156 -msgid "Done" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:545 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:157 -msgid "Confirmation dialogs have all been reset" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 -msgid "System port selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:551 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 -msgid "Failed to install command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 -msgid "Command line tools installed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 -msgid "Command line tools installed in" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:576 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "No valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:628 -msgid "%s is not a valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:631 -msgid "Choose plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 -msgid "Plugin cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:644 -msgid "The plugin: %s cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 -msgid "Plugin not customizable" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:654 -msgid "Plugin: %s does not need customization" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:662 -msgid "Customize" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 -msgid "Cannot remove builtin plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:701 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 -msgid "Invalid tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:717 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:747 -msgid "You must select a column to delete it" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 -msgid "The selected column is not a custom column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:754 -msgid "Do you really want to delete column %s and all its data?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 -msgid "Error log:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:828 -msgid "Access log:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 -msgid "Failed to start content server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 -msgid "Invalid size" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:882 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:951 -msgid "Must restart" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:952 -msgid "" -"The changes you made require that Calibre be restarted. Please restart as " -"soon as practical." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:986 -msgid "Checking database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1006 -msgid "Failed to check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1011 -msgid "Some inconsistencies found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1012 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 -msgid "TabWidget" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 -msgid "" -"Here you can control how calibre will read metadata from the files you add " -"to it. calibre can either read metadata from the contents of the file, or " -"from the filename." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 -msgid "Read metadata only from &file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 -msgid "" -"Swap the firstname and lastname of the author. This affects only metadata " -"read from file names." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 -msgid "&Swap author firstname and lastname" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 -msgid "" -"If an existing book with a similar title and author is found that does not " -"have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book " -"already has the format, then it is silently ignored.\n" -"\n" -"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " -"punctuation, case, etc. Author match is exact." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:142 -msgid "" -"If books with similar titles and authors found, &merge the new files " -"automatically" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:143 -msgid "&Configure metadata from file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:144 -msgid "&Adding books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:145 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Save to Disk button:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:146 -msgid "Save &cover separately" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:147 -msgid "Update &metadata in saved copies" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:148 -msgid "Save metadata in &OPF file" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:149 -msgid "Convert non-English characters to &English equivalents" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:150 -msgid "Format &dates as:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:151 -msgid "File &formats to save:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:152 -msgid "Replace space with &underscores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:153 -msgid "Change paths to &lowercase" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:154 -msgid "&Saving books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:155 -msgid "Metadata &management:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:156 -msgid "Manual management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:157 -msgid "Only on send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:158 -msgid "Automatic management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:159 -msgid "" -"

  • Manual Management: Calibre updates the metadata and adds " -"collections only when a book is sent. With this option, calibre will never " -"remove a collection.
  • \n" -"
  • Only on send: Calibre updates metadata and adds/removes " -"collections for a book only when it is sent to the device.
  • \n" -"
  • Automatic management: Calibre automatically keeps metadata on the " -"device in sync with the calibre library, on every connect
  • " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:162 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Send to Device button. This setting can be overriden for individual devices " -"by customizing the device interface plugins in Preferences->Plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:163 -msgid "Sending to &device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 -msgid "Show notification when &new version is available" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 -msgid "Default network &timeout:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 -msgid " seconds" -msgstr " segons" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 -msgid "Choose &language (requires restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 -msgid "Normal" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:146 -msgid "High" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:147 -msgid "Low" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 -msgid "Job &priority:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -msgid "Preferred &output format:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:153 -msgid "Tags to apply when adding a book:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:152 -msgid "" -"A comma-separated list of tags that will be applied to books added to the " -"library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:154 -msgid "Reset all disabled &confirmation dialogs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:155 -msgid "Preferred &input format order:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 -msgid "User Interface &layout (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:150 -msgid "Restriction to apply when the current library is opened:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:151 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 -msgid "Disable &animations" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 -msgid "&Toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 -msgid "&Icon size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 -msgid "Show &text under icons:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:158 -msgid "Use internal &viewer for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 -msgid "Use &Roman numerals for series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "Show ¬ifications in system tray" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "Add an email address to which to send books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "&Add email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "&Current tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -msgid "&Restore to defaults" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "&Tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -msgid "" -"calibre contains a network server that allows you to access your book " -"collection using a browser from anywhere in the world. Any changes to the " -"settings will only take effect after a server restart." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "Server &port:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 -msgid "&Username:" -msgstr "Nom d'&usuari:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 -msgid "&Password:" -msgstr "&Contrasenya:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 -msgid "Max. &cover size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 -msgid "&Show password" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -msgid "Max. &OPDS items per query:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 -msgid "Max. OPDS &ungrouped items:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "&Start Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -msgid "St&op Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "&Test Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 -msgid "Run server &automatically on startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 -msgid "View &server logs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

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

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:696 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:697 -msgid "Enable/&Disable plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:698 -msgid "&Customize plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:699 -msgid "&Remove plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:700 -msgid "Add new plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:701 -msgid "Plugin &file:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:703 -msgid "&Add" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125 -msgid "Create Tag-based Column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126 -msgid "Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127 -msgid "Column heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128 -msgid "Column type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129 -msgid "Use brackets" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130 -msgid "Values can be edited" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 -msgid "Text" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136 -msgid "Number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -#: /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:889 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 -msgid "Date" -msgstr "Data" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138 -msgid "Tag on book" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:139 -msgid "Explanation text added in create_ct_column.py" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140 -msgid "Create and edit tag-based columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 -msgid "Text, column shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:22 -msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:25 -msgid "Long text, like comments, not shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:28 -msgid "Text column for keeping series-like information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 -msgid "Integers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 -msgid "Ratings, shown with stars" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 -msgid "Yes/No" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 -msgid "No column selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:70 -msgid "No column has been selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:74 -msgid "Selected column is not a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:105 -msgid "No lookup name was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 -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/dialogs/config/create_custom_column.py:109 -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/dialogs/config/create_custom_column.py:118 -msgid "No column heading was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:124 -msgid "The lookup name %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:134 -msgid "The heading %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:117 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:102 -msgid "&Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:103 -msgid "Column &heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:104 -msgid "" -"Used for searching the column. Must contain only digits and lower case " -"letters." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:105 -msgid "" -"Column heading in the library view and category name in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:106 -msgid "Column &type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:107 -msgid "What kind of information will be kept in the column." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:108 -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" -"

    For example:\n" -"

      \n" -"
    • ddd, d MMM yyyy gives Mon, 5 Jan 2010
    • \n" -"
    • dd MMMM yy gives 05 January 10
    • \n" -"
    " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:114 -msgid "Use MMM yyyy for month + year, yyyy for year only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:115 -msgid "Default: dd MMM yyyy." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:116 -msgid "Format for &dates" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:21 -msgid "Getting debug information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22 -msgid "Copy to &clipboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24 -msgid "Debug device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44 -msgid "Invalid template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45 -msgid "The template %s is invalid:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42 -msgid "Save &template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:43 -msgid "" -"By adjusting the template below, you can control what folders the files are " -"saved in and what filenames they are given. You can use the / character to " -"indicate sub-folders. Available metadata variables are described below. If a " -"particular book does not have some metadata, the variable will be replaced " -"by the empty string." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44 -msgid "Available variables:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34 -msgid "Downloading social metadata, please wait..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:35 -msgid "Switch between library and device views" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:38 -msgid "Separator" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:51 -msgid "Choose library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:201 -msgid "The main toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:202 -msgid "The main toolbar when a device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:203 -msgid "The context menu for the books in the calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:205 -msgid "The context menu for the books on the device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:243 -msgid "Cannot add" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:244 -msgid "Cannot add the actions %s to this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:261 -msgid "Cannot remove" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:262 -msgid "Cannot remove the actions %s from this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Customize the actions in:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -msgid "A&vailable actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 -msgid "&Current actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 -msgid "Move selected action up" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 -msgid "Move selected action down" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 -msgid "Ctrl+S" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -msgid "Add selected actions to toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:107 -msgid "Remove selected actions from toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:109 -msgid "Restore to &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" msgstr "ERROR" @@ -6996,7 +6334,15 @@ msgid "Location" 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:1064 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 +msgid "Date" +msgstr "Data" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1066 msgid "Format" msgstr "Format" @@ -7068,11 +6414,11 @@ msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" msgstr "Recull metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 msgid "" "

    calibre can find metadata for your books from two locations: Google " "Books and isbndb.com.

    To use isbndb.com you must sign up for a " @@ -7080,73 +6426,116 @@ msgid "" "below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" msgstr "Recull" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 msgid "Matches" msgstr "Coincidències" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 msgid "" "Select the book that most closely matches your copy from the list below" msgstr "Seleccioneu el llibre que més s'acoste del llistat que hi ha a sota" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Overwrite author and title with author and title of selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 msgid "Details of job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:49 msgid "Active Jobs" msgstr "Treballs actius" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:50 msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +msgid "Lower Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +msgid "Upper Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +msgid "Title Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:119 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:166 +msgid "Book %d:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:182 +msgid "" +"Search and replace in text fields using regular expressions. 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. See this " +"reference for more information, and in particular the 'sub' function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 +msgid "" +"Note: you can destroy your library using this feature. Changes are " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +msgid "Search/replace invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +msgid "Search pattern is invalid: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 msgid "Edit Meta information" msgstr "Editar Meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -7154,63 +6543,63 @@ msgstr "" "Especifiqueu com s'ha d'ordenar l'autor(s) d'aquest llibre. Per " "exemple,ordena Vicent A. Estellés com a Estellés, Vicent A." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Rating:" msgstr "&Valoració:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "Rating of this book. 0-5 stars" msgstr "Valora aquest llibre: 0-5 estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid " stars" msgstr " estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -msgid "Remove all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +msgid "Remove all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 msgid "Remove &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -7218,258 +6607,333 @@ 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:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 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:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +msgid "Apply function &after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +msgid "Test &text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +msgid "Test re&sult" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +msgid "Your test:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +msgid "&Search and replace (experimental)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:133 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:150 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:169 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:200 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:223 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:229 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:240 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:295 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:296 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +msgid "" +" The green color indicates that the current author sort matches the current " +"author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +msgid "" +" The red color indicates that the current author sort does not match the " +"current author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:586 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:591 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 msgid "Cannot fetch cover" msgstr "No puc aconseguir la coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:598 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 msgid "Could not fetch cover.
    " msgstr "No puc aconseguir la coberta.
    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 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:759 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Edit Meta Information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Meta information" msgstr "Meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Author S&ort: " msgstr "&Ordena autors: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "" -"Automatically create the author sort entry based on the current author entry" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles.\n" +"If the box is colored green, then text matches the individual author's sort " +"strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 -msgid "Remove unused series (Series that have no books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -msgid "IS&BN:" -msgstr "IS&BN:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 -msgid "Publishe&d:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 -msgid "dd MMM yyyy" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +msgid "" +"Automatically create the author sort entry based on the current author " +"entry.\n" +"Using this button to create author sort will change author sort from red to " +"green." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 -msgid "&Date:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -msgid "&Comments" +msgid "Remove unused series (Series that have no books)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +msgid "IS&BN:" +msgstr "IS&BN:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +msgid "Publishe&d:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +msgid "dd MMM yyyy" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +msgid "&Date:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +msgid "&Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Add a new format for this book to the database" msgstr "Afegir un nou format per a aquest llibre a la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina els formats seleccionats per a aquest llibre de la base de dades." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 -msgid "Download &cover" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "&Generate cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:61 msgid "Password needed" msgstr "Es necessita 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/preferences/server_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +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/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +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/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "" @@ -7483,31 +6947,31 @@ msgid "" "The current saved search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Saved Search Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Saved Search: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 msgid "Select a saved search to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Delete this selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:93 msgid "Enter a new saved search name." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:94 msgid "Add the new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:96 msgid "Change the contents of the saved search" msgstr "" @@ -7536,7 +7000,7 @@ msgid "Last downloaded" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "" @@ -7556,115 +7020,115 @@ msgstr "" msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194 +#: /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:195 +#: /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:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 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:210 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263 +#: /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/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "Delete downloaded news older than " msgstr "" @@ -7686,56 +7150,56 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 msgid "Find entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 msgid "&All these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 msgid "This exact &phrase:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 msgid "&One or more of these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 msgid "But dont show entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 msgid "Any of these &unwanted words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 msgid "" "Regular expression: the expression must match anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 msgid " " msgstr " " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 msgid "" "See the User Manual for more help" @@ -7746,12 +7210,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:80 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 msgid "Authors" msgstr "Autors" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:113 msgid "Publishers" msgstr "Editors" @@ -7764,51 +7228,51 @@ msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "User Categories Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 msgid "A&vailable items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Apply tags to current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "A&pplied items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 msgid "Select a category to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Delete this selected tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:169 msgid "Enter a new category name. Select the kind before adding it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:172 msgid "Category filter: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:173 msgid "Select the content kind of the new category" msgstr "" @@ -7823,43 +7287,43 @@ msgid "" "to delete them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:137 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:138 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:139 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -7868,12 +7332,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7897,34 +7361,39 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 msgid "Category Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Items in use" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:79 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:106 +msgid "Ctrl+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:56 msgid "Test email settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:57 msgid "Send test mail from %s to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 msgid "&Test" msgstr "" @@ -7942,7 +7411,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 -#: /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:260 msgid "Switch to Advanced mode" msgstr "" @@ -8007,35 +7476,35 @@ msgstr "" msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "&Share recipe" 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:258 msgid "Customize &builtin recipe" 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:259 msgid "&Load recipe from file" 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:261 msgid "" "